2

モデル検証などのすべての利点を得るために、各行が個別に送信できるビューである編集可能なテーブルを作成しようとしています.

ここに私が持っているものがあります:
モデル:

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に直接配置することには問題があるに違いないと思います。

誰かが以前にこの問題を抱えていましたか? 回避策を知っていますか?

ありがとう!

4

1 に答える 1

1

フォームを直接 tr に配置することには問題があるに違いないと思います

ええ、まさにそれです。必要なものnested table:

@model Mvc4TestApp.Models.PersonModel
<td colspan="3">
    @using (Ajax.BeginForm("Edit", new AjaxOptions() { InsertionMode = InsertionMode.Replace, UpdateTargetId = string.Format("Person-{0}", Model.Id) }))
    {
        <table>
            <tr>
                <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>
            </tr>
        </table>
    }
</td>
于 2013-06-04T10:22:07.047 に答える