我有一个场景,我希望有一个可编辑项目列表,每个项目提交按钮,即应该允许一次只提交一个项目。
我尝试了不同的方法,我能找到的最佳答案就是这个:How to use multiple form elements in ASP.NET MVC,但问题是它假设一个表单,因此只有一个提交按钮。
所以,这是我到目前为止所尝试的内容。模特:
namespace TestWebApplication4.Models
{
public class Entity
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
}
public class TestModel
{
public IEnumerable<Entity> Entities { get; set; }
}
}
所以我有一个Entity对象的集合,我想集体显示,并单独编辑和提交。我尝试这样做的方法是在一个视图上有多个表单:
@using TestWebApplication4.Models
@model TestWebApplication4.Models.TestModel
@{
int i = 0;
foreach (Entity entity in Model.Entities)
{
i++;
<div>
@using (Html.BeginForm("Index"))
{
@Html.HiddenFor(model => entity.Id)
@Html.TextAreaFor(model => entity.Name, new {id = "entity_Name" + i})
@Html.ValidationMessageFor(model => entity.Name)
<button type="submit">Submit</button>
}
</div>
}
}
和控制器:
namespace TestWebApplication4.Controllers
{
public class TestController : Controller
{
public ActionResult Index()
{
var model = BuildModel();
return View(model);
}
[HttpPost]
public ActionResult Index(Entity entity)
{
if (!ModelState.IsValid)
{
var model = BuildModel(entity);
return View(model);
}
return RedirectToAction("Index");
}
private static TestModel BuildModel(Entity entity = null)
{
var entities = new List<Entity>
{
new Entity {Id = 11, Name = "Product A"},
new Entity {Id = 12, Name = "Product B"},
new Entity {Id = 13, Name = "Product C"},
};
if (entity != null)
entities[entities.IndexOf(entities.Single(e => e.Id == entity.Id))] = entity;
return new TestModel {Entities = entities};
}
}
}
正如您所看到的,我尝试在[HttpPost]索引操作中接收单个Entity对象,如果它无效(未提供Name值)则重新构建整个列表并将特定实体替换为无效的(所有这些都发生在BuildModel方法中),以显示验证消息。但是这不能正常工作,因为结果视图包含3个条目,所有条目都具有相同的无效实体,即我得到三个空TextAreas和三个&#34; Name字段是必需的。&#34;验证消息。 任何人都可以帮我解决这个问题吗?我假设我做了一些违反惯例的事情,并且这个问题可能是完全错误的方法,但是我无法在任何地方找到解决方案,所以任何方向都会受到赞赏。提前谢谢。