从视图中经过时在所述控制器接收缺少的参数(Missing parameter received in

2019-10-18 16:39发布

我有包括在我的asp.net mvc4鉴于某些机型,所以我必须创建一个包含两个其他车型基本视图模型:

namespace MyNamespace.Models
{
    public class CustomViewModel
    {
        public FirstTypeModel FirstViewModel { get; set; }
        public SecondTypeModel SecondViewModel { get; set; }
    }
}

和视图:

 @model MyNamespace.Models.CustomViewModel

 @using (Html.BeginForm("AddFields", "Configure", FormMethod.Post))
 { 
         (...)
                 <div id="componentId">
                     @Html.LabelFor(m => m.FirstViewModel.SelectedCompTypeId, new { @id = "componentIdLabel" })
                     @Html.DropDownListFor(m => m.FirstViewModel.SelectedCompTypeId, Model.FirstViewModel.CompTypeItems, new { @name = "SelectedCompTypeId", @id = "componentType" })
                 </div>
         (...)

                 <input id="submitAddComp" type="submit" value="@Resource.ButtonTitleAddComponent" />

 }

在我的控制器:

public ActionResult AddFields(string param1, string param2, string param3, int selectedCompTypeId)
{
 ...
}

当提交按钮我得到selectedCompTypeId为无效点击(参数1,参数2和参数3正确传递),但如果我看下面的请求从控制器内具有正确的价值:

Request["FirstViewModel.SelectedCompTypeId"]

所以如何通过正确的参数给控制器,以selectedCompTypeId不为空?

注:其中只有一种模式,创建包含其他两个示范基地之前,它正常工作。 之前,兰巴表达式为m => m.SelectedCompTypeId代替米=> m.FirstViewModel.SelectedCompTypeId。

Answer 1:

添加一个构造函数初始化您的第一个和第二个模型。

namespace MyNamespace.Models
{
    public class CustomViewModel
    {
        public CustomViewModel()
        {
            FirstViewModel = new FirstTypeModel();
            SecondViewModel = new SecondTypeModel();
        }

        public FirstTypeModel FirstViewModel { get; set; }
        public SecondTypeModel SecondViewModel { get; set; }
    }
}

编辑:但不是通过所有参数一个接一个,只要把模型本身在AddFields行动。 你所面对的问题是,当你正在使用DropDownListFor参数的名称是“FirstViewModel.SelectedCompTypeId”,而不仅仅是“SelectedCompTypeId”当你在你的控制器有它。

有2个选项,其中一个比另一个更好:

选项1:

而不是使用

public ActionResult AddFields(string param1, string param2, string param3, int selectedCompTypeId)
{
 ...
}

使用这种方式

public ActionResult AddFields(CustomViewModel model)
{
 ...
}

这是更好的,因为如果你添加更多的字段明天,你不需要改变操作签名,并且绑定是由框架来完成。

选项2:更改DropDownListFor一个DropDownList ,这样一来,你可以说这是参数的名称,并使其发挥作用。 这是迄今为止preferrable第一个选项...是清洁的。

@Html.DropDownList("selectedCompTypeId", theList, "Select one...", new { @class = "myNiceCSSStyle"})


文章来源: Missing parameter received in the controller when passing from view