注意:我对 ASP.Net MVC 还是比较陌生,所以我可能在这里采取了错误的方法;不要犹豫,这样说。
问题的总结是,如果我有一个强类型化到某些模型对象集合(例如IEnumerable<ModelStateTest.Models.DataObject>
,这些表单中的所有表单都会反映来自已编辑的特定对象的值。
我明白为什么会这样;如果您进行一些服务器端验证或处理,但它失败了,您不想丢弃所有用户的更改并恢复到以前存储在数据库中的内容。我不知道如何在表单绑定到多个对象的页面上管理此行为。
这是一些演示该行为的示例代码。如果您单击任何“保存”按钮,则所有三个表单都会反映您保存的表单中的任何字段值。我希望这种情况不会发生;我只想要保存的行来反映发布的表单变量。我只有粗略的想法如何实现这一点,我不想巧合地编写代码。
模型\DataObject.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ModelStateTest.Models {
public class DataObject {
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
}
}
控制器\HomeController.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ModelStateTest.Models;
namespace ModelStateTest.Controllers {
public class HomeController : Controller {
public ActionResult Index() {
return View("Index", new List<DataObject> {
new DataObject { Field1 = "Obj 1, Field 1", Field2 = "Obj 1, Field 2", Field3 = "Obj 1, Field 3" },
new DataObject { Field1 = "Obj 2, Field 1", Field2 = "Obj 2, Field 2", Field3 = "Obj 2, Field 3" },
new DataObject { Field1 = "Obj 3, Field 1", Field2 = "Obj 3, Field 2", Field3 = "Obj 3, Field 3" }
});
}
public ActionResult SaveItem(DataObject obj) {
return Index();
}
}
}
视图\主页\Index.cshtml:
@model IEnumerable<ModelStateTest.Models.DataObject>
@{
ViewBag.Title = "Index";
}
@foreach (var obj in Model) {
using (Html.BeginForm("SaveItem", "Home", FormMethod.Get)) {
@Html.TextBox("Field1", obj.Field1);
@Html.TextBox("Field2", obj.Field2);
@Html.TextBox("Field3", obj.Field3);
<input type="submit" value="Save" />
}
}