c# - 更新多个相同类型的项目

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

我正在使用 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 条目。”

感谢您的帮助。

最佳答案

第一个问题:您的 View 处理多个ViewPerm,但您的后操作只需要一个

更改您的发布方法以处理多个:

[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 来迭代 View 中模型中的项目。这些字段需要正确索引,以便模型绑定(bind)器可以完成它的工作(它适用于数组)。将您的 View 更改为:

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

关于c# - 更新多个相同类型的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15121515/

相关文章:

c# - 如何找出文本文件中的行数?

.net - 使用 log4Net 在单个进程中记录多个客户端的帮助

c# 在派生类中隐藏属性

c# - Linq To Entities 在 where 子句中进行错误的 SQL 转换

c# - 未选择字段的SQL语句

c# - 在 C# 中将 reg 值写入本地计算机

c# - ASP.NET MVC 应用程序从 SQLite 数据库读取数据

asp.net-mvc - 在 MVC 中一起使用 Ajax.ActionLink 和 ChildActionOnly 失败

c# - 如何检查日期时间是否等于 20 :00 *local* time

java - 在 Mac 和 PC 上运行的 .NET 和 Java 之间进行选择