我在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。
答案 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