模型与复杂类型的绑定

时间:2015-08-12 01:46:31

标签: asp.net-mvc razor model-binding

我已经制作了一个测试控制器和视图来测试复杂的绑定,但我似乎无法使其工作。

这是我的ViewModel:

public class TestViewModel
{
    public SubTest MainTest { get; set; }

    public List<SubTest> SubTestList { get; set; }
}

public class SubTest
{
    public string Name { get; set; }
    public int Id { get; set; }
}

这是我的观点:

@model TestViewModel    

@{
    using (Html.BeginForm())
    {
        <h2>Main</h2>

        <p>
            @Html.DisplayTextFor(m => m.MainTest.Id)
            =>
            @Html.DisplayTextFor(m => m.MainTest.Name)
        </p>

        <h2>Subs</h2>

        foreach (var sub in Model.SubTestList)
        {
            <p>
                @Html.DisplayTextFor(m => sub.Id)
                =>
                @Html.DisplayTextFor(m => sub.Name)
            </p>
        }

        <button type="submit">Submit</button>
    }
}

这是我的控制器:

public ActionResult Test()
{
    TestViewModel tvm = new TestViewModel();
    tvm.MainTest = new SubTest() { Id = 0, Name = "Main Test" };

    tvm.SubTestList = new List<SubTest>()
    {
        new SubTest() { Id = 1, Name = "Sub Test 1" } ,
        new SubTest() { Id = 2, Name = "Sub Test 2" } ,
        new SubTest() { Id = 3, Name = "Sub Test 3" } ,
        new SubTest() { Id = 4, Name = "Sub Test 4" } ,
    };

    return View(tvm);
}

[HttpPost]
public ActionResult Test(TestViewModel tvm)
{
    return View(tvm);
}

当我加载页面时,一切都正确显示,但如果我在POST方法中设置断点,我会看到参数值都为空。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

首先DisplayTextFor()不会生成表单控件(input,textarea,select),因此表单没有任何内容可以回发。

其次,如果您确实想要修改模型的值(比如使用文本框),那么您需要使用for循环(或自定义EditorTemplate作为{{1}的类型})不是集合属性的SubTest循环,例如

foreach

或使用for (int i = 0; i < Model.SubTestList.Count; i++) { @Html.TextBoxFor(m => m.SubTestList[i].Id) @Html.TextBoxFor(m => m.SubTestList[i].Name) } (模板名称必须与您的模型类型匹配

EditorTemplate

/View/Shared/EditorTemplates/SubTest.cshtml

并在主视图中

@model yourAssembly.SubTest
@Html.TextBoxFor(m => m.Id)
@Html.TextBoxFor(m => m.Name)

@model TestViewModel .... @Html.EditorFor(m => m.SubTestList) 方法接受EditorFor(),并且足够聪明,可以从模板中为集合中的每个项目呈现html。