每行内联编辑器,带有单独的提交按钮

时间:2014-04-22 15:01:51

标签: asp.net-mvc

我有一个场景,我希望有一个可编辑项目列表,每个项目提交按钮,即应该允许一次只提交一个项目。

我尝试了不同的方法,我能找到的最佳答案就是这个: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;验证消息。 任何人都可以帮我解决这个问题吗?我假设我做了一些违反惯例的事情,并且这个问题可能是完全错误的方法,但是我无法在任何地方找到解决方案,所以任何方向都会受到赞赏。提前谢谢。

0 个答案:

没有答案