Должен ли я использовать одну форму или одну на строку таблицы asp.net mvc - PullRequest
6 голосов
/ 11 ноября 2011

Я только что поймал себя на этом:

<table>
   <tr>
      <th>Code</th>
      <th>Enabled</th>
      <th>Percentage</th>
      <th>Amount</th>
      <th>Start</th>
      <th>End</th>
      <th>Action</th>
   </tr>
   @foreach(var item in Model)
   {
      <tr>
         <td>@Html.ActionLink(item.Code, "Edit", new { id = item.Id })</td>
         <td>@item.Enabled ? "Yes" : "No"</td>
         <td>@item.Percentage</td>
         <td>@item.Amount</td>
         <td>@item.StartDate</td>
         <td>@item.EndDate</td>
         <td>
            @using (Html.BeginForm("Delete", "Discounts", new { id = item.Id }))
            {
               <input type="submit" value="Delete" />
            }
         </td>
      </tr>
   }
</table>

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

Я, наверное, уже знаю ответ, но подумал, что проверю: -)

Ответы [ 3 ]

6 голосов
/ 11 ноября 2011

Я бы сказал, что это зависит от вашего конкретного сценария.

  • Если вам нужно минимизировать размер страницы, вы можете перейти на одну форму. Однако тогда вам нужно будет использовать javascript для обновления некоторых (скрытых) полей перед отправкой формы.
  • С другой стороны, ваш текущий подход работает, даже если пользователь выключил JavaScript

Исходя из моих текущих знаний о вашей ситуации, я бы, вероятно, согласился с тем, что у вас есть сейчас, просто потому, что это красиво и чисто.

2 голосов
/ 11 ноября 2011

Я думаю, что ваш подход в порядке и часто лучший.например, если вы писали приложение с системой голосования, такой как stackoverflow (пример выбран, потому что вы смотрите на такое приложение прямо сейчас), и вы хотели реализовать механизм голосования с помощью HttpPost, то вы можете создать небольшой элемент управления си кнопки вниз как отдельные формы *.Таким образом, вы можете легко добавить любое количество таких «виджетов» на страницу, и содержащей их странице не нужно будет ничего о них знать (в том числе, если они вообще присутствовали).В самом деле, вы можете использовать ненавязчивый javascript для отправки формы и перезагрузить «виджет» голосования с возвратом после сбоя, чтобы перезагрузить страницу, если javascript был выключен, и все это могло бы выглядеть довольно красиво.

* ПРИМЕЧАНИЕ: я неИмейте в виду, что именно так они и делают при стеке потока!

Отказ без AJAX может выглядеть так:

[HttpPost]
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
public ActionResult DoThing(whatever params you are passing in)
{
  // Do stuff and then...
  if (Request.IsAjaxRequest)
  {
      return View("_partialThingView", thingViewModel);
  }
  else
  {
      RedirectToAction("Index");
  }
}
0 голосов
/ 11 ноября 2011

Я думаю, что это лучший подход, , если вы не хотите реализовать функцию массового удаления (ваш HTML-код говорит мне, что это не так).

Используя форму (с методом POST) для каждого элемента, вы убедитесь, что

  • Вы удаляете только один элемент за раз
  • Вы не удаляете элементы случайно, вызывая такой URL как http://[yoursite]/[yourapp]/[delete_method]/[item_id_to_delete].

Итак, продолжайте ваш текущий подход. (мои 0,02 евро)

...