将模型和额外参数从视图传递到 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 中的操作的主要内容,如果未能解决你的问题,请参考以下文章

ASP .NET MVC 3 - 将参数从视图传递到控制器

将多个参数从 ajax post 传递到 asp.net mvc 控制器

如何将复杂的键值参数表单视图传递给mvc中的控制器?

C# MVC 使用 dotnetfiddle 将参数从视图传递到控制器

如何使用 ajax get 将数据从 View 传递到 Controller 或使用参数在 mvc 中发布

JQuery将'空参数传递给MVC控制器方法