MVC 4模型绑定在部分视图中使用的嵌套模型

时间:2014-06-02 17:11:23

标签: c# asp.net-mvc razor

我遇到了以下问题,当我尝试在我的控制器方法中绑定模型时,嵌套模型没有绑定(输入名称不匹配,因为它在局部视图中使用)。

让我用代码示例说明问题:

控制器:

public class TestController : Controller
{
    public ActionResult Create()
    {
        var model = new Test2();
        model.Basisgegevens.Name = "Test";
        model.Basisgegevens.Omschrijving = "Omschrijving";

        return View(model);
    }

    [HttpPost]
    public ActionResult Create(Test2 model)
    {
        return View(model);
    }
}

型号:

public class Test
{
    public string Name { get; set; }

    public string Omschrijving { get; set; }
}

public class Test2
{
    public Test2()
    {
        this.Basisgegevens = new Test();
    }

    public int PeriodeVanId { get; set; }

    public int PeriodeTotId { get; set; }

    public Test Basisgegevens { get; set; }
}

查看:

@model WebApplication4.Models.Test2

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Test2</h4>
        <hr />
        @Html.ValidationSummary(true)

        <div class="form-group">
            @Html.LabelFor(model => model.PeriodeVanId, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.PeriodeVanId)
                @Html.ValidationMessageFor(model => model.PeriodeVanId)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.PeriodeTotId, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.PeriodeTotId)
                @Html.ValidationMessageFor(model => model.PeriodeTotId)
            </div>
        </div>

        @Html.Partial("~/Views/Test/Partials/Naam.cshtml", Model.Basisgegevens)

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

部分观点:

@model WebApplication4.Models.Test

<div class="form-group">
    @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </div>
</div>

<div class="form-group">
    @Html.LabelFor(model => model.Omschrijving, new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.Omschrijving)
        @Html.ValidationMessageFor(model => model.Omschrijving)
    </div>
</div>

部分视图中使用的模型'Test'由另一个控制器使用,因此我无法更改输入字段名称(以允许绑定)。

这是发送到服务器: PeriodeVanId:0 PeriodeTotId:0 名称:测试 Omschrijving:Omschrijving

我希望底层2个属性(来自嵌套模型)在控制器级别的模型绑定中重命名为: Basisgegevens.Name Basisgegevens.Omschrijving

这将允许绑定,然后模型验证正确启动。

有没有人知道这个简单的模型绑定问题的解决方案?

2 个答案:

答案 0 :(得分:0)

您需要将partial渲染为编辑器。使用以下

@Html.EditorFor(model => model.Basisgegevens, "~/Views/Test/Partials/Naam.cshtml")

这将正确命名输入,以便它们应该绑定。基本上它告诉剃刀,部分是形式不是无关内容的一部分

答案 1 :(得分:0)

对我来说,当我使用Html.EditorFor并在文件夹EditorTemplates下移动部分视图时,它可以正常工作。

您需要创建文件夹EditorTemplates的两个选项:

  • 在特定视图下
  • 或在共享文件夹中。

enter image description here

enter image description here

在MVC 5应用程序上测试。