我研究了几种不同的场景,关于对视图绑定对象列表执行批量更新(视图到模型)的最佳方法,但是没有找到关于“最佳”的真正明确的方法实现这一目标的方法。我是MVC的新手并且通过回到我们的一些内部应用程序并在MVC 2下重新创建它来自学。我发现处理单个对象更新很容易,但是倍数给我带来了一些麻烦。
一点背景......
假设您有一个模型对象是List的视图。渲染页面时,视图会迭代模型的集合,并使用一系列文本框,标签和其他与UI相关的内容构建单个表单...想想显示一周中的日期和两个显示“小时”的字段和'加班时间'。呈现的页面有一个单独的html表单,其操作为“update”,并带有List的参数。有一个输入可以调用此操作。预期的行为是视图将所有对象发送回控制器以进行更新。例如,如果星期五加载时间表,并且从星期二开始之前的小时数,则用户可以更改星期二的小时数,将更多小时数添加到一周中的其他日期,删除小时等等...所有这些都来自单个“提交”按钮。
我显然可以进行单一更新,但我正在寻找一种批量执行此操作的方法。
在拼写时间表应用程序之前,我拼凑了一个我想要解决的快速示例。
控制器动作示例:
public ActionResult Index()
{
List<SampleModel> data = _repo.List();
return View(data);
}
示例'保存'动作:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Save(List<SampleModel> mod)
{
//Save code removed
return RedirectToAction("Index");
}
正在构建的示例视图表单:
<% using (Html.BeginForm("Save", "Home"))//,new {Collection= Model}
{ %>
<div class="cont">
<% for (int i = 0; i < Model.Count; i++)//foreach (var a in Model)
{
var a = Model[i];%>
<div class="child">
<div class="header">
<img alt="" src="../../Img/no.png" class="close" />
<h3><%: Html.Label(a.Name)%></h3>
</div>
<div class="info">
<%: Html.TextAreaFor(r => a.Msg) %>
<br />
<% for (int t = 0; t < a.Hours.Count; t++)
{ %>
<p>
<%: Html.Label("Hours") %>
<%: Html.TextBoxFor(m => a.Hours[t]) %>
</p>
<%} %>
</div>
</div>
<% } %>
<br class="clr" />
<input type="submit" value="Save Changes" />
</div>
<% } %>
虽然这个示例并没有完全重新创建我需要做的事情,但它足够接近一般的想法。我们有一个带有通用列表的模型,列表中的每个对象都有一个可编辑的属性和可以编辑的对象集合。
调用控制器方法时,传回的列表为null。在检查Fiddler跟踪时,我看到名称值对返回,但它们以迭代器的局部变量引用开头(例如:a.Msg = update&amp; a.Hours%5B0%5D = 1&amp; a.Hours%5B1%5D = 1安培; a.Hours%5B2%5D = 12&安培; a.Msg =你好+从+ ID +%23 + 1和; a.Hours%5B0%5D = 39&安培; a.Hours%5B1%5D = 43&安培; a.Hours% 5B2%5D = 21&安培; a.Msg =你好+从+ ID +%23 + 2及a.Hours%5B0%5D = 18&安培; a.Hours%5B1%5D = 41&安培; a.Hours%5B2%5D = 26&安培; a.Msg =你好+从+ ID + 23%+ 3及a.Hours%5B0%5D = 27&安培; a.Hours%5B1%5D = 9&安培; a.Hours%5B2%5D = 28)
从此我收集控制器无法创建List。有人能指出我如何进行这种“批量”操作吗?
提前感谢所有人!