Asp.net mvc 4 从视图传递时,控制器中接收到缺少的参数

Asp.net mvc 4 从视图传递时,控制器中接收到缺少的参数,asp.net-mvc-4,razor,Asp.net Mvc 4,Razor,我在asp.net mvc4视图中包含了一些模型,因此我创建了一个基本视图模型,其中包含两个其他模型: namespace MyNamespace.Models { public class CustomViewModel { public FirstTypeModel FirstViewModel { get; set; } public SecondTypeModel SecondViewModel { get; set; } } }

我在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" />

 }
单击submit按钮时,我会将selectedCompTypeId设置为null param1,param2和param3会正确传递,但如果我在控制器内查看以下请求,则其值正确:

Request["FirstViewModel.SelectedCompTypeId"]
那么,如何将正确的参数传递给控制器,以使selectedCompTypeId不为空


注意:仅包括一个模型,在创建包含其他两个模型的基础模型之前,它工作正常。之前,lamba表达式是m=>m.SelectedCompTypeId,而不是m=>m.FirstViewModel.SelectedCompTypeId。

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

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操作中即可。您面临的问题是,在使用DropDownList时,参数的名称是FirstViewModel.SelectedCompTypeId,而不仅仅是控制器中的SelectedCompTypeId

有两个选项,一个比另一个好:

备选案文1:

而不是使用

public ActionResult AddFields(string param1, string param2, string param3, int selectedCompTypeId)
{
 ...
}
这样用吧

public ActionResult AddFields(CustomViewModel model)
{
 ...
}
这更好,因为如果明天添加更多字段,就不需要更改操作签名,绑定由框架完成

选项2:将DropDownList更改为DropDownList,这样,您可以说出参数的名称,并使其工作。这是首选的第一个选择。。。它更干净

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

我这样做了,也有同样的行为。模型初始化也可以在控制器中完成。在我的答案中添加了信息。。。请看一看。你试过下面的答案了吗?如果它对你有用,接受答案。。。如果没有,请评论正在发生的事情。
@Html.DropDownList("selectedCompTypeId", theList, "Select one...", new { @class = "myNiceCSSStyle"})