【问题标题】:Updating multiple items of the same type更新同一类型的多个项目
【发布时间】:2013-02-27 20:16:05
【问题描述】:

我正在使用 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);
    }

当我点击保存按钮时,它显示“存储更新、插入或删除语句影响了意外数量的行 (0)。实体可能在加载实体后已被修改或删除。刷新 ObjectStateManager 条目。”

感谢您的帮助。

【问题讨论】:

    标签: c# .net asp.net-mvc razor asp.net-mvc-4


    【解决方案1】:

    第一个问题:您的视图处理 多个 ViewPerm,但您的发布操作只需要 一个

    改变你的post方法来处理多个:

    [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);
    }
    

    您的第二个问题是您正在使用foreach 在您的视图中遍历模型中的项目。这些字段需要正确索引,以便模型绑定器可以完成它的工作(它适用于数组)。将您的视图更改为:

    @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>
    }
    

    【讨论】:

    • 我在 m[i].Roles.Role 的 cshtml 中遇到了 a 和那些喜欢它并且 Model[i] 说“不能使用 [] 将索引应用于“System.Collections.Generic.IEnumerable”类型的表达式
    • @user2116960 将您的模型和操作方法更改为List&lt;ViewPerm&gt; 而不是IEnumerable
    • 对不起,我还在学习MVC。你能给我一个例子或告诉我如何去做。感谢您的帮助。
    • @user2116960 将您的操作方法从 public ActionResult Index(IEnumerable&lt;ViewPerm&gt; viewperms) 更改为 public ActionResult Index(List&lt;ViewPerm&gt; viewperms) 并将您的视图模型声明更改为 @model List&lt;ViewPerm&gt; :)
    • 好的。这行得通,但是现在当我去保存它时,它给了我这个错误“实体类型 List`1 不是当前上下文模型的一部分。”在 db.Entry(viewperms).State = EntityState.Modified;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    相关资源
    最近更新 更多