我有以下型号:
public class ContratoDetailsViewModel
{
[StringLength(50)]
[RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2,4})$")]
[DisplayName("E-Mail Adm.")]
public string emailAdm { get; set; }
}
public class ContratoDetailContainerViewModel
{
public ContratoDetailsViewModel contrato { get; set; }
public IList<ContratoModels.CCasinoViewModel> ccasinos { get; set; }
}
public class CCasinoViewModel
{
public short codigo { get; set; }
public List<SelectListItem> listCasinos { get; set; }
}
以下观点:
@model ContratoModels.ContratoDetailContainerViewModel
@{
...
}
@using (Html.BeginForm(new { currentaction = ViewBag.mode }))
{
...
@Html.EditorFor(m => m.contrato.emailAdm, state1)<br />
@Html.EditorFor(m => m.ccasinos,"test")
<input type="submit" value="Save" />
}
在“EditorTemplates”文件夹中,我有一个名为“test.cshtml”的模板:
@model List<ContratoModels.CCasinoViewModel>
@for (int i = 0; i < Model.Count(); i++)
{
@Html.DropDownListFor(m => m[i].codigo,Model[i].listCasinos)
}
我的控制器后期操作是这样的:
[HttpPost]
public ActionResult Details(ContratoModels.ContratoDetailContainerViewModel model, FormCollection form)
{
var contrato = model.contrato;
var casinos = model.ccasinos;
}
在发送视图之前,ccasinos,codigo和listCasinos已初始化 当我处于调试模式时,我看到它们的价值......表单显示就像魅力一样。 但是......当我提交表单时,model.ccasinos总是为空!为什么? 非常感谢你的回复。
注意:我使用EditorFor和我的主模型的孩子,但是如果有更好的解决方案 用于显示和提交MCV 3我感兴趣...
答案 0 :(得分:2)
尝试更换:
@Html.EditorFor(m => m.ccasinos, "test")
用这个:
@Html.EditorFor(m => m.ccasinos)
然后将您的test.cshtml
模板重命名为CCasinoViewModel.cshtml
并将其内容替换为:
@model CCasinoViewModel
@Html.DropDownListFor(x => x.codigo, Model.listCasinos)
因为编辑器模板的命名方式与列表类型相同,所以ASP.NET MVC会自动为该列表的每个元素呈现它,这样就不必编写循环。
您也可以安全地从您的操作中删除FormCollection
参数。使用视图模型时,它完全没用:
[HttpPost]
public ActionResult Details(ContratoModels.ContratoDetailContainerViewModel model)
{
var contrato = model.contrato;
var casinos = model.ccasinos;
...
}