2015-07-13 5 views
1

Я пытаюсь сделать MVC 5 веб-страницу Razor с таблицей в нем, Каждая строка в этой таблице содержит кнопку Удалить, которая после действия:кнопка Submit является подачи первой формы на странице

<table> 
    <thead> 
     <tr> 
      <th>Name</th> 
      . 
      . 
      . 
      <th>Actions</th> 
     </tr> 
    </thead> 
    <tbody> 
     @foreach(var item in Model) 
     { 
      <tr> 
       <td>@item.Name</td> 
       . 
       . 
       . 
       <td> 
        @using(Html.BeginForm("Delete", "Person", FormMethod.Post)) 
        { 
         @html.AntiForgetyToken() 
         @html.Hidden("personId", item.PersonId) 

         <button type="submit" class="btn">Delete</button> 
        } 
       </td> 
      </tr> 
     } 
    </tbody> 
</table> 

И в контроллере:

public class PersonController : BaseController 
{ 
    [HttpPost, ValidateAntiForgeryToken] 
    public ActionResult Delete(int personId) 
    { 
     // Do Something... 
    } 
} 

Теперь моя проблема при нажатии кнопки Delete в любой строке таблицы всегда представившая первую форму на странице, которая означает, что первое лицо в таблице всегда удаляются независимо от того, какую кнопку отправки я нажимаю. Любые идеи для решения этой проблемы?

Edit: Сформированной страница HTML

<div class="page-header"> 
    <h2>Person List</h2> 
</div> 

<table class="row table table-striped"> 
    <thead> 
     <tr class="text-primary"> 
      <th class="text-center">#</th> 
      <th>Name</th> 
      <th>Email</th> 
      <th>Status</th> 
      <th>Action</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
      <td class="text-center">5</td> 
      <td>Ismail</td> 
      <td>[email protected]</td> 
      <td>Active</td> 
      <td> 
       <form action="/WebApp/Person/Delete?PersonID=5" method="post"> 
        <input name="__RequestVerificationToken" type="hidden" value="Uxhp0Bq1ATAwOXNODHmc74f12O2-dvFhQ5kletbmDkq64CEPWZlXXPKuHDoqSy4DXF6mJhYfGffc_YAn1yERxp69JCUT9IlGTKdfirvVvqE1" /> 
        <div class="text-center"> 
         <div class="btn-group btn-group-xs"> 
          <a class="btn btn-default" href="/WebApp/Person/Details?PersonID=5">View</a> 
          <a class="btn btn-default" href="/WebApp/Person/Edit?PersonID=5">Edit</a> 
          <button class="btn btn-danger>Delete</button> 
         </div> 
        </div> 
       </form>      
      </td> 
     </tr> 
     <tr> 
      <td class="text-center">6</td> 
      <td>MoHaKa</td> 
      <td>[email protected]</td> 
      <td>Active</td> 
      <td> 
       <form action="/WebApp/Person/Delete?PersonID=6" method="post"> 
        <input name="__RequestVerificationToken" type="hidden" value="R4CUAuVpbGihZvrFxxCjCL_oJ7tgkS_Xxh67i_xCpMXpvZKR5ASUWrSCvjg52yRorF-Ypeau1oZwDi96caHyUj-gmBeHnx7NBgfJBLkLPnQ1" /> 
        <div class="text-center"> 
         <div class="btn-group btn-group-xs"> 
          <a class="btn btn-default" href="/WebApp/Person/Details?PersonID=6">View</a> 
          <a class="btn btn-default" href="/WebApp/Person/Edit?PersonID=6">Edit</a> 
          <button class="btn btn-danger>Delete</button> 
         </div> 
        </div> 
       </form>      
      </td> 
     </tr> 

    </tbody> 
</table> 
+0

Мои глаза могут быть обманывая меня, но я не вижу 'hidden' вход для' personId', который должен быть частью полезной нагрузки POST на сгенерированной странице. – EdSF

+0

Да, но @AlexPolyankin попросил меня удалить скрытый ввод и использовать routeValues ​​вместо этого, он дает тот же результат, кстати – MoHaKa

+0

Ваш 'controller' ограничен' HttpPost' (а не 'GET') - отлаживает ваш контроллер и проверяет, какое значение вы получите для параметра 'personId'). – EdSF

ответ

0

Используйте это вместо вашего кода формы:

@using(Html.BeginForm("Delete", "Person", new { item.PersonId })) 
{ 
    @Html.AntiForgetyToken() 
    <button class="btn">Delete</button> 
} 

ASP.NET MVC поведение действия по умолчанию: примитивные типы первым заглянуло в запросе строка.

+0

Вы уверены, что он будет генерировать правильный маршрут? Разве это не должно быть 'new {personId = item.PersonId}'? –

+0

@teovankot Да, это ярлык. Подробнее [здесь] (http://csharp.2000things.com/tag/anonymous-types/). – ranquild

+0

Я пробовал это, он не работает ни, Идентификатор первого лица в таблице входит в параметр personId – MoHaKa

0

Может, лучше использовать только одну форму и добавить клетку, как это вместо нескольких форм:

<td onclick="window.location='@Url.Action("Delete", new { PersonID = item.PersonId })'" style="cursor:pointer;"> 
</td>