khe*_*eya 3 razor asp.net-mvc-3
List<Task>
我的模型中有一个。此列表中包含2个任务(例如)
public List<Task> Tasks { get; set; }
public class Task {
public Task()
{
Title="";
Total= 0;
}
public string Title{ get; set; }
public int Total{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在在我的Razor视图,我想呈现两个文本框为每个Tasks
在List<Tasks>
我的模型。
我没有循环,只是放置了直接文本框,例如:
@Html.TextBoxFor(m => m.Tasks[0].Title, new { @maxlength = "50"})
@Html.TextBoxFor(m => m.Tasks[0].Total, new { @maxlength = "2"})
<br>
@Html.TextBoxFor(m => m.Tasks[1].Title, new { @maxlength = "50"})
@Html.TextBoxFor(m => m.Tasks[1].Total, new { @maxlength = "2"})
Run Code Online (Sandbox Code Playgroud)
这样可以使表单正常显示,但是单击“提交”按钮对FF不起作用。但是,它在IE9中发布正常。
查看源代码显示了这样生成的html:
<input id="Tasks_0__Title" maxlength="50" name="Tasks[0].Title" type="text" value="" />
<input data-val="true" data-val-number="The field Total must be a number." data-val-required="The Total field is required." id="Tasks_0__Total" maxlength="2" name="Tasks[0].Total" type="text" value="" />
Run Code Online (Sandbox Code Playgroud)
该HTML看起来不正确。它name="Tasks[0].Total"
似乎有些奇怪。
我应该如何做才能List<>
在发布后从控制器中访问文本框值?
谢谢
编辑: 我只是保留一行进行测试。这是我在FF中看到的html。
<input id="Tasks_0__Title" type="text" value="" name="Tasks[0].Title" maxlength="50">
<input id="Tasks_0__Total" type="text" value="" name="Tasks[0].Total" maxlength="2" data-val-required="The Total field is required." data-val-number="The field Total must be a number." data-val="true">
Run Code Online (Sandbox Code Playgroud)
单击提交按钮时,此消息不会发布。
现在,如果我name="Tasks[0].Title" to name="Tasks_0__Title" and name="Tasks_0__Total"
在FIREBUG中进行了更改,它将发布得很好。
如果我完全删除姓名,它也会在FF中发布
您应该使用Tasks[0].Total
和Tasks[1].Total
而不是Items
:
@Html.TextBoxFor(m => m.Tasks[0].Title, new { @maxlength = "50"})
@Html.TextBoxFor(m => m.Tasks[0].Total, new { @maxlength = "2"})
<br/>
@Html.TextBoxFor(m => m.Tasks[1].Title, new { @maxlength = "50"})
@Html.TextBoxFor(m => m.Tasks[1].Total, new { @maxlength = "2"})
Run Code Online (Sandbox Code Playgroud)
name="Tasks[0].Total"
不奇怪。这正是输入的命名方式,以便模型绑定程序在POST操作中取回值。有关处理列表和字典时默认模型联编程序使用的有线格式,请参见此博客文章。
话虽如此,我建议您使用编辑器模板=>而不是在视图中编写这5行代码,而应将它们替换为:
@Html.EditorFor(x => x.Tasks)
Run Code Online (Sandbox Code Playgroud)
然后在相应的编辑器模板(~/View/Shared/EditorTemplates/Task.cshtml
)中,该模板将自动为Tasks
集合中的每个元素呈现:
@model Task
@Html.TextBoxFor(m => m.Title, new { @maxlength = "50"})
@Html.TextBoxFor(m => m.Total, new { @maxlength = "2"})
<br/>
Run Code Online (Sandbox Code Playgroud)
现在,您可以让编辑器模板不必担心正确的命名约定等。
就您的POST操作而言:
[HttpPost]
public ActionResult Foo(MyViewModel model)
{
// model.Tasks should be correctly bound here
...
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8102 次 |
最近记录: |