2013-02-27 23 views
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); 
    } 

当我打的保存按钮它说:“商店更新,插入或删除语句影响行的一个意外的数(0)。实体可能已被修改或删除,因为实体已加载。刷新ObjectStateManager条目。“

感谢您的帮助。

回答

2

第一个问题:你有多个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通过在您的视图模型的项目进行迭代。这些字段需要正确编制索引,以便模型联编程序可以完成它的工作(它对数组起作用)。改变你的看法是:

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

我在** M [I] ** Roles.Role和那些喜欢它,碰上在CSHTML **型号[I] **说:“可以不适用索引。与[]到一个表达式'System.Collections.Generic.IEnumerable ' – user2116960 2013-02-27 20:56:20

+0

@ user2116960改变你的模型和你的动作方法是一个'List '而不是'IEnumerable' – mattytommo 2013-02-27 20:58:06

+0

对不起, – user2116960 2013-02-27 21:01:18