1

我在我的 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 => m.SelectedCompTypeId 而不是 m => m.FirstViewModel.SelectedCompTypeId。

4

1 回答 1

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; }
    }
}

编辑: 但不要一一传递所有参数,只需将模型本身放入您的 AddFields 操作中。您面临的问题是,您使用DropDownListFor的参数名称是“FirstViewModel.SelectedCompTypeId”,而不仅仅是控制器中的“SelectedCompTypeId”。

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

选项1:

而不是使用

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

以这种方式使用它

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

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

选项 2:更改DropDownListFor for a DropDownList,这样,您可以说出参数的名称,并使其工作。最好是第一个选项……更干净。

@Html.DropDownList("selectedCompTypeId", theList, "Select one...", new { @class = "myNiceCSSStyle"})
于 2013-09-29T23:37:01.500 回答