从视图传递时,控制器中收到的参数丢失

时间:2013-09-29 23:28:36

标签: asp.net-mvc-4 razor

我在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视为null(param1,param2和param3正确传递),但如果我在控制器内观察下面的请求,则它具有正确的值:

Request["FirstViewModel.SelectedCompTypeId"]

那么如何将正确的参数传递给控制器​​以使selectedCompTypeId不为空?

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

1 个答案:

答案 0 :(得分:0)

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

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

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

修改 但是不是一个接一个地传递所有参数,只需将Model本身放在AddFields动作中。您面临的问题是,当您使用DropDownListFor时,参数的名称为“FirstViewModel.SelectedCompTypeId”,而不仅仅是“SelectedCompTypeId”,因为您在控制器中使用它。

有两种选择,一种比另一种更好:

选项1:

而不是使用

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

以这种方式使用

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

这样更好,因为如果明天添加更多字段,则无需更改操作签名,绑定由框架完成。

选项2:更改DropDownListFor的{​​{1}},这样,您就可以说出参数的名称,并使其正常工作。它是首选的选择......更清洁。

DropDownList