将模型和额外参数从视图传递到 MVC 中的操作
Posted
技术标签:
【中文标题】将模型和额外参数从视图传递到 MVC 中的操作【英文标题】:Pass model and extra parameter from view to an action in MVC 【发布时间】:2014-08-29 11:42:13 【问题描述】:我正在尝试将userid
传递给我在控制器中的操作。我的操作如下所示:
[HttpPost]
[Authorize(Roles = "Admin,Expert")]
public ActionResult AddExpert(AssistanceJuror assistanceJuror,int UserId)
User user = objUserRepository.FindBy(i => i.Id == assistanceJuror.UserId).First();
user.Enable = "فعال";
assistanceJuror.Date = DateTime.Now;
objUserRepository.Edit(user);
objUserRepository.Save();
objAssistanceJurorRepository.Add(assistanceJuror);
TempData["Message"] = "کارشناس به معاونت اختصاص داده شد";
objAssistanceJurorRepository.Save();
return RedirectToAction("IndexExpert", "Assistance");
所以这个动作需要 2 个参数,其中一个是我的模型,另一个是 userId
。所以我需要从视图中获取两个值,我的视图是这样的:
@using ViewModelDomain
@using Repository;
@model DomainClass.AssistanceJuror
@
ViewBag.Title = "AddExpert";
@using (html.BeginForm())
@Html.ValidationSummary(true)
<div class="wrapper-left">
<div class="wrapper-top-addCompany">
انتساب کارشناس به معاونت
<div style="float: left; padding-left: 20px;">
<div class="divider"></div>
<div class="buttonPossion">
@Html.ActionLink("بازگشت", "Index", "Assistance", new companyid = ViewBag.firstIdeaId , new @class = "buttonBlueLink" )
</div>
<div class="divider"></div>
</div>
</div>
<div class="wrapper-Member" style="padding-bottom: 30px; margin-bottom: 5px; width: 100%; min-height: 550px;">
<h2>اضافه کردن کارشناس جدید
</h2>
<br />
<br />
<br />
<div class="editor-label">
انتخاب معاونت
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.AssistanceId, (SelectList)ViewBag.listAssistance)
</div>
<div class="editor-label">
انتخاب کارشناس
</div>
@* <div class="editor-field">
@Html.DropDownListFor(model => model.userId, (SelectList)ViewBag.listDisableExpert)
</div>*@
@
if (User.IsInRole("Expert") || User.IsInRole("Admin"))
<div class="wrapper-Member" style="border-top: 1px solid #d3d3d3; margin-top: 30px; width: 99.5%; border-left: 1px solid #d3d3d3; margin-right: 1px">
<div class="tab-list-company" style="margin-right: -1px; width: 180px">
<h2 style="font: normal 13px BHoma; margin-right: 10px; margin-top: 2px;">اختصاص کارشناس به معاونت
</h2>
</div>
<div class="list-company" style="border: none; width: 98%">
<table>
<thead>
<tr>
<th>نام و نام خانوادگی</th>
<th>سطح تحصیلات</th>
<th>رشته تحصیلی</th>
<th>شماره همراه</th>
<th>تلفن</th>
<th>ایمیل</th>
@if (User.IsInRole("Expert") || User.IsInRole("Admin"))
<th style="width: 20px;">اضافه</th>
</tr>
</thead>
@
userRepository objUserRepository = new userRepository();
//var listJuror = objUserRepository.FindBy(i => i.Permission == "Juror").ToList();
List<DomainClass.User> listDisableAssistance = objUserRepository.ReturnUserByEnablePermission("غیرفعال", "Assistance");
@foreach (var temp in listDisableAssistance)
<tr>
<td>
@
string fullName = temp.Name + " " + temp.Family;
@Html.DisplayFor(modelItem => fullName)
</td>
<td>
@Html.DisplayFor(modelItem => temp.EducationLevel)
</td>
<td>
@Html.DisplayFor(modelItem => temp.Field)
</td>
<td>
@Html.DisplayFor(modelItem => temp.Mobile)
</td>
<td>
@Html.DisplayFor(modelItem => temp.Tell)
</td>
<td>
@Html.DisplayFor(modelItem => temp.Email)
</td>
<td>
@using (Html.BeginForm("AddExpert", "Assistance", routeValues: new userid = temp.Id ))
<input type="submit" value="" class="Add" title="اضافه کردن" />
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
@section Scripts
@Scripts.Render("~/bundles/jqueryval")
在这部分
<td>
@using (Html.BeginForm("AddExpert", "Assistance", routeValues: new userid = temp.Id ))
<input type="submit" value="" class="Add" title="اضافه کردن" />
</td>
我正在尝试将我的 userId
传递给我的操作,但它不起作用,并且我收到一条错误消息,提示用户 ID 为空。
最好的问候
【问题讨论】:
您生成的嵌套表单。不确定是否是问题所在,但它的 html 无效且不受标准支持,因此您应该考虑更改它。如果模型不为空,那么我认为它必须冒泡到外部表单并提交,因此内部表单路由值可能会被忽略。 您的呼叫是否以用户 ID 为空的操作到达? @faby 在我第一次单击提交时出现此错误:参数字典包含方法'System.Int32'的不可空类型'System.Int32'的参数'userid'的空条目。 'Presentation.Controllers.AssistanceController' 中的 Web.Mvc.ActionResult AddExpert(DomainClass.AssistanceJuror, Int32)'。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数 @EA 尝试将 UserId 的类型从int
更改为 int?
只是为了检查它是否正常工作..
@EA 在您的操作方法的第一行放置一个断点。电话到了吗?
【参考方案1】:
我认为问题在于您没有将assistanceJuror
参数发送到控制器。
new userid = temp.Id
应该是
new assistanceJuror= value, userid = temp.Id
但我认为AssistanceJuror
是一种复杂类型,因此您会收到错误消息。尝试仅发送一个 id(例如)并从控制器中的数据库获取信息。
类似的东西
public ActionResult AddExpert(string assistanceJurorId,int UserId)
var assistanceJuror= //get Your Variable Here;
User user = objUserRepository.FindBy(i => i.Id == assistanceJuror.UserId).First();
user.Enable = "فعال";
assistanceJuror.Date = DateTime.Now;
objUserRepository.Edit(user);
objUserRepository.Save();
objAssistanceJurorRepository.Add(assistanceJuror);
TempData["Message"] = "کارشناس به معاونت اختصاص داده شد";
objAssistanceJurorRepository.Save();
return RedirectToAction("IndexExpert", "Assistance");
并从视图中以这种方式调用它
@using (Html.BeginForm("AddExpert", "Assistance", routeValues: new assistanceJurorId= model.AssistanceId, userid = temp.Id ))
通过这种方式,您不会将下拉列表的选定值(存储在model.AssistanceId
变量中)传递给控制器
assistanceJurorId= model.AssistanceId
但是模型中属性的初始值因为下拉列表是这样制作的
@Html.DropDownListFor(x => x.AssistanceId, (SelectList)ViewBag.listAssistance))
要在下拉列表中发送所选元素的正确值,我建议您删除 Html。 BeginForm 并仅在提交表单时对您的控制器进行 ajax 调用。通过这种方式,您可以确定将发送正确的值。
【讨论】:
那么 assitanceId 呢?如何将它传递给控制器? @faby, “这样你就传递了下拉列表的选定值”。不,你不是。 Razor 代码在服务器上进行解析,因此在BeginForm()
方法中创建的路由基于 AssistanceId
的初始值,而不是用户在浏览器中选择的值。
@StephenMuecke 是的,你是对的,我必须编辑答案,但我在移动设备上,我不能。我会尽快更新。
@faby,没有任何意义。 OP 正在生成不受支持的无效嵌套表单,并且无论如何可能在不同的浏览器中都不会保持一致。这确实需要以不同的方式解决(例如 AJAX)
@StephenMuecke 我知道,因此我向 OP 提出了类似的解决方案。现在我编辑答案以解释要做什么,当我有更多时间时,我将添加代码【参考方案2】:
MVC 的最佳方法是在您的 GET 方法中创建一个模型,在您的视图中使用它,然后在接受 Post 动词的 Action 中发布该模型。因此,创建一个模型类,在其中添加所有属性(也是用户 ID),在顶部添加视图
@model YourClassModel
还有你的 POST 方法
public ActionResult AddExpert(YourClassModel model)
【讨论】:
以上是关于将模型和额外参数从视图传递到 MVC 中的操作的主要内容,如果未能解决你的问题,请参考以下文章
将多个参数从 ajax post 传递到 asp.net mvc 控制器
C# MVC 使用 dotnetfiddle 将参数从视图传递到控制器