Использую ли я одну форму или по одной на строку таблицы asp.net mvc

#html #asp.net-mvc #standards

#HTML #asp.net-mvc #стандарты

Вопрос:

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

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

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

Я, вероятно, уже знаю ответ, но подумал, что проверю 🙂

Комментарии:

1. Нет причин не иметь другую форму для каждой строки, если каждая форма выполняет свою работу.

Ответ №1:

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

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

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

Ответ №2:

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

* ПРИМЕЧАНИЕ: Я не думаю, что в stackoverflow это делают именно так, имейте в виду!

Сбой без 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");
  }
}
  

Комментарии:

1. 1 за упоминание Ajax-запросов и полезного фрагмента кода 🙂

Ответ №3:

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

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

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

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