2

MVC 4 を使用していますが、編集ページを削除して、インデックス ページで必要な変更を同時に複数の項目に加えたいと考えています。

CSHTML は次のとおりです。

@model IEnumerable<HelpDesk.Models.ViewPerm>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>

@using (Html.BeginForm())
{
@Html.ValidationSummary(true)

<fieldset>
    <legend>ViewPerm</legend>
    <table style="border: 5px solid white;">
        <tr>
            <th style="border: 5px solid white;">
                @Html.DisplayNameFor(model => model.Roles.Role)
            </th>
            <th style="border: 5px solid white;">
                @Html.DisplayNameFor(model => model.Views.Page)
            </th>
            <th style="border: 5px solid white;">
                @Html.DisplayNameFor(model => model.Perm)
            </th>
            <th></th>
        </tr>
        @foreach (var item in Model)
        {
            <tr>
                <td style="border: 5px solid white;">
                    @Html.DisplayFor(modelItem => item.Roles.Role)
                </td>
                <td style="border: 5px solid white;">
                    @Html.DisplayFor(modelItem => item.Views.Folder)
                    @Html.DisplayFor(modelItem => item.Views.Page)
                </td>
                <td style="border: 5px solid white;">
                    @Html.EditorFor(modelItem => item.Perm)
                </td>
                <td>                        
                    @Html.ActionLink("Delete", "Delete", new { id = item.VPermID })
                </td>
            </tr>
        }
    </table>
    <input type="submit" value="Save" />
</fieldset>
}


@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

そしてC#:

    public ActionResult Index()
    {
        var viewperm = db.ViewPerm.Include(v => v.Roles).Include(v => v.Views);
        return View(viewperm.ToList());
    }

    [HttpPost]
    public ActionResult Index(ViewPerm viewperm)
    {
        if (ModelState.IsValid)
        {
            db.Entry(viewperm).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(viewperm);
    }

保存ボタンを押すと、「Store update、insert、または delete ステートメントが予期しない行数 (0) に影響しました。エンティティが読み込まれてから、エンティティが変更または削除された可能性があります。ObjectStateManager エントリを更新してください。」と表示されます。

助けてくれてありがとう。

4

1 に答える 1

2

最初の問題: ビューは複数の ViewPermを処理しますが、投稿アクションは1 つしか取りません。

複数を処理するように投稿方法を変更します。

[HttpPost]
public ActionResult Index(IEnumerable<ViewPerm> viewperms)
{
    if (ModelState.IsValid)
    {
        foreach (ViewPerm viewperm in viewperms)
        {
            db.Entry(viewperm).State = EntityState.Modified;
        }

        db.SaveChanges();
    }

    return View(viewperms);
}

2 番目の問題はforeach、ビュー内のモデル内のアイテムを反復処理するために a を使用していることです。モデルバインダーがそれを実行できるように、フィールドに正しくインデックスを付ける必要があります(配列で機能します)。ビューを次のように変更します。

@for (int i = 0; i < Model.Count(); i++)
{
    <tr>
        <td style="border: 5px solid white;">
            @Html.DisplayFor(m => m[i].Roles.Role)
        </td>
        <td style="border: 5px solid white;">
            @Html.DisplayFor(m => m[i].Views.Folder)
            @Html.DisplayFor(m => m[i].Views.Page)
        </td>
        <td style="border: 5px solid white;">
            @Html.EditorFor(m => m[i].Perm)
        </td>
        <td>                        
            @Html.ActionLink("Delete", "Delete", new { id = Model[i].VPermID })
        </td>
    </tr>
}
于 2013-02-27T20:23:05.887 に答える