如何解决MVC Razor视图:如何在模型中呈现List <Task>的文本框列表?
| 我的模型中有一个“ 0”。此列表中包含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; }
}
现在在我的剃刀视图中,我要为模型的List<Tasks>
中的每个Tasks
渲染2个文本框。
我没有循环,只是放置了直接文本框,例如:
@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\"})
这样可以使表单正常显示,但是单击“提交”按钮对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=\"\" />
该HTML看起来不正确。 has6ѭ似乎很奇怪。
我应该如何做才能在发布后从控制器中的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\">
单击提交按钮时,此消息不会发布。
现在如果我改变change9ѭ
在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\"})
name=\"Tasks[0].Total\"
并不奇怪。这正是输入的命名方式,以便模型绑定器在POST操作中取回值。有关处理列表和字典时默认模型联编程序使用的有线格式,请参见此博客文章。
话虽如此,我建议您使用编辑器模板=>而不是在视图中编写这5行代码,而应将它们替换为:
@Html.EditorFor(x => x.Tasks)
然后在相应的编辑器模板(~/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/>
现在,您可以让编辑器模板不必担心正确的命名约定等。
就您的POST操作而言:
[HttpPost]
public ActionResult Foo(MyViewModel model)
{
// model.Tasks should be correctly bound here
...
}
,如果您想让多个元素具有文本框。
for (int i = 0; i < Model.Students.Count; i++)
{
@Html.HiddenFor(modelIem => Model.Students[i].StudentId)
<tr>
<td>
@Html.DisplayFor(modelItem => Model.Students[i].Student.FirstNames)
</td>
<td>
@Html.DisplayFor(modelItem => Model.Students[i].Student.LastNames)
</td>
<td>
@Html.TextBoxFor(modelItem => Model.Students[i].Score,new { @type = \"number\" })
</td>
</tr> }
这是ViewModel
public class MyModel
{
public List<StudentGrade> Students { get; set; }
}
public class StudentGrade {
public ApplicationUser Student { get; set; }
[Range(1,100)]
public int? Score { get; set; } = null;
public string Description { get; set; } = null;
public string StudentId { get; set; }
}
最后,它看起来像这样。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。