モデル検証などのすべての利点を得るために、各行が個別に送信できるビューである編集可能なテーブルを作成しようとしています.
ここに私が持っているものがあります:
モデル:
public class PeopleGroup
{
public string Name { get; set; }
public ICollection<PersonModel> People { get; set; }
}
public class PersonModel
{
[Required]
public uint Id { get; set; }
[Required]
[RegularExpression("[\\w\\s]{2,100}")]
[StringLength(100)]
public string FirstName { get; set; }
[Required]
[RegularExpression("[\\w\\s]{2,100}")]
[StringLength(100)]
public string LastName { get; set; }
}
リストビュー:
@model Mvc4TestApp.Models.PeopleGroup
@{
ViewBag.Title = "People";
}
<h2>@Model.Name</h2>
<table>
@foreach (var item in Model.People)
{
<tr id="@string.Format("Person-{0}", item.Id)">
@Html.Partial("EditorSingle", item)
</tr>
}
</table>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
行 (部分) ビュー:
@model Mvc4TestApp.Models.PersonModel
@using (Ajax.BeginForm("Edit", new AjaxOptions() { InsertionMode = InsertionMode.Replace, UpdateTargetId = string.Format("Person-{0}", Model.Id) }))
{
<td>@Html.EditorFor(x => x.FirstName)</td>
<td>@Html.EditorFor(x => x.LastName)</td>
<td>
<input type="submit" value="OK" />
@Html.HiddenFor(x => x.Id)
</td>
}
ここにコントローラーがあります:
public class PeopleController : Controller
{
public ActionResult Index()
{
return View(new PeopleGroup()
{
Name = "Presidents",
People = GetPeople()
});
}
public ActionResult Edit(PersonModel model)
{
if (ModelState.IsValid)
{
var people = GetPeople();
var original = people.Where(x => x.Id == model.Id).SingleOrDefault();
if (original != null)
people.Remove(original);
people.Add(model);
}
return PartialView("EditorSingle", model);
}
public ICollection<PersonModel> GetPeople()
{
ICollection<PersonModel> collection = Session["people"] as ICollection<PersonModel>;
if (collection == null)
{
collection = new List<PersonModel>() {
new PersonModel() { Id = 0, FirstName = "George", LastName = "Washington"},
new PersonModel() { Id = 1, FirstName = "Abraham", LastName = "Lincoln"},
new PersonModel() { Id = 2, FirstName = "Thomas", LastName = "Jefferson"}
};
Session["people"] = collection;
}
return collection;
}
}
すべてをリスト (table -> ul、tr -> li、td -> div) としてテストしましたが、問題ありません! ただし、テーブルとしては、最初の送信でのみ機能します。同じ行を再度送信するとすぐに、何も起こりません。私はそれをデバッグしましたが、問題は、ajax を介して送信されたフォームに対してフォーム送信イベントがスローされていないことです。これはasp mvcとは何の関係もないと確信しています。フォームをtrに直接配置することには問題があるに違いないと思います。
誰かが以前にこの問題を抱えていましたか? 回避策を知っていますか?
ありがとう!