查看具有子项的模型,该子项充当强类型部分视图的模型

时间:2014-07-18 02:31:39

标签: c# asp.net-mvc

我有一个由主页面组成的系统,它启动一个表单:

@model Stuvo_Intakeformulier.Models.CaterRequest

@using (Html.BeginForm(null, null, FormMethod.Post, new { id="fooData", @class="form-horizontal", role="form"}))
        {
         <div id="generalInfo" style="display:none">
              @{Html.RenderPartial("Food", Model.foodInfo);}
         </div>

         <div id="studyInfo" style="display:none">          
               @{Html.RenderPartial("Drinks", Model.drinkInfo);}
               <input type="submit" value="Bevestigen">
        ....

使用父模型

public class CaterRequest
{
    public CaterRequest()
    {
        foodInfo = new Food();
        drinkInfo = new Drinks();
    }

   public Food foodInfo { get; set; }
   ....

这样的儿童模特:

public class Food
{
    [Required(ErrorMessage = "BlaBla")]
    public string name { get; set; }
}

最后,局部视图如下所示:

@model Stuvo_Intakeformulier.Models.Food

<div class="form-group">    
        @Html.LabelFor(model => Model.name, "Naam: ", htmlAttributes: new { @class = "col-sm-2 control-label" })
        <div class="col-sm-10">
            @Html.TextBoxFor(model => Model.name, null ,htmlAttributes: new { @class = "form-control" })
        </div>
        <div class="col-sm-offset-2 col-sm-10">
            @Html.ValidationMessageFor(model => Model.name)
        </div>
    </div>

显然,当我发布我的model.foodInfo.name时,由于在我的部分视图中,name属性为name而不是foodInfo.name,因此将为空。我可以通过使用@Html.TextBoxFor(model => Model.name..更改@Html.TextBox('foodInfo.name'来解决这个问题,但后来我失去了强类型部分视图的所有优点(特别是客户端验证,这是我绝对需要的)。

我想知道这个问题的最佳解决方案是什么?有没有简单的方法来解决这个问题?什么是最干净的解决方案?

基本上我想在普通视图中将强类型部分视图中的数据绑定到我的模型,同时仍然保持强类型视图和验证内容。

1 个答案:

答案 0 :(得分:1)

我们使用DisplayForEditorFor模板。它干净,并提供您提到的所有功能。我们的工作代码与this link非常相似。

所以在上面的示例中,您需要创建一个可以包含类似于您的内容的Food.cshtml:

@model Stuvo_Intakeformulier.Models.Food

    <div class="form-group">    
                @Html.LabelFor(model => Model.name, "Naam: ", htmlAttributes: new { @class = "col-sm-2 control-label" })
                <div class="col-sm-10">
                    @Html.TextBoxFor(model => Model.name, null ,htmlAttributes: new { @class = "form-control" })
                </div>
                <div class="col-sm-offset-2 col-sm-10">
                    @Html.ValidationMessageFor(model => Model.name)
                </div>
</div>

上面的Food.cshtml文件必须放在“Shared / EditorTemplates /”文件夹中。

然后在您的主页面中,您可以调用:

 <div id="generalInfo" style="display:none">
      @Html.EditorFor(m => m.foodInfo)
 </div>

顺便说一句,你在public string foodInfo { get; set; }中有拼写错误,它应该是public Food foodInfo { get; set; }吗?