2013-02-27 2 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

Я бегу в в cshtml на ** м [I] ** Roles.Role и те, как это и ** Model [я] ** говоря "не может применить индексацию. с [] выражением типа «System.Collections.Generic.IEnumerable ' – user2116960

+0

@ user2116960 Измените свою модель и ваш метод действий на« Список »вместо« IEnumerable » – mattytommo

+0

Извините, Я все еще изучаю MVC. Не могли бы вы привести мне пример этого или рассказать мне, как это сделать. Спасибо за вашу помощь. – user2116960