微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MVC Razor视图:如何在模型中呈现List <Task>的文本框列表?

如何解决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 举报,一经查实,本站将立刻删除。