我已经制作了一个测试控制器和视图来测试复杂的绑定,但我似乎无法使其工作。
这是我的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方法中设置断点,我会看到参数值都为空。
我做错了什么?
答案 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。