Asp.net mvc 4 从视图传递时,控制器中接收到缺少的参数
我在asp.net mvc4视图中包含了一些模型,因此我创建了一个基本视图模型,其中包含两个其他模型: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; } } }
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"})