绑定模型与子列表MVC 3剃刀

时间:2011-11-16 13:35:44

标签: asp.net asp.net-mvc asp.net-mvc-3 razor

我有以下型号:

    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我感兴趣...

1 个答案:

答案 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;
    ...
}