Как лучше всего избежать написания представлений добавления и редактирования при использовании ASP.NET MVC?

Представления «Добавить» и «Редактировать» часто невероятно похожи, так что создание двух представлений неоправданно. По мере развития приложения вы будете вносить одинаковые изменения в оба.

Однако обычно есть небольшие различия. Например, поле может быть доступно только для чтения после того, как оно было добавлено, и если это поле является DropDownList, вам больше не нужен этот список в ViewData.

Итак, должен ли я создать класс данных представления, который содержит всю информацию для обоих представлений, где, в зависимости от выполняемой операции, определенные свойства будут иметь значение NULL?
Следует ли мне включать операцию в данные представления как перечисление ?
Следует ли заключить все тонкие различия в ‹% if (ViewData.Model.Op == Ops.Editing) {%>?

Или есть способ лучше?


person tgmdbm    schedule 20.08.2008    source источник
comment
Ага! Было бы неплохо иметь возможность использовать одно и то же представление для: добавления, редактирования и просмотра ...   -  person Filip Frącz    schedule 14.11.2008


Ответы (4)


На самом деле это довольно просто. Предположим, вы редактируете сообщение в блоге.

Вот ваши 2 действия для создания / редактирования:

public class BlogController : Controller
{
   public ActionResult New()
   {
      var post = new Post();
      return View("Edit", post);
   }

   public ActionResult Edit(int id)
   {
      var post = _repository.Get(id);
      return View(post);
   }

   ....

}

А вот вид:

<% using(Html.Form("save")) { %>
<%= Html.Hidden("Id") %>

<label for="Title">Title</label>
<%= Html.TextBox("Title") %>

<label for="Body">Body</label>
<%= Html.TextArea("Body") %>

<%= Html.Submit("Submit") %>
<% } %>

А вот действие Сохранить, которому представление отправляет:

public ActionResult Save(int id, string title, string body)
{
   var post = id == 0 ? new Post() : _repository.Get(id);
   post.Title = title;
   post.Body = body;

   _repository.Save(post);

   return RedirectToAction("list");
}
person Ben Scheirman    schedule 03.09.2008
comment
Вместо того, чтобы репостить именно то, что вы сделали, я мог бы предложить вам отредактировать свой ответ, включив в него пример переключения поля, которое будет доступно только для чтения на экране редактирования, как в исходном вопросе. - person Chris; 11.12.2009

Мне не нравится, что представления становятся слишком сложными, и до сих пор я имел тенденцию иметь отдельные представления для редактирования и добавления. Я использую пользовательский элемент управления для хранения общих элементов, чтобы избежать повторения. Оба представления будут сосредоточены вокруг одних и тех же ViewData, и у меня есть маркер на моих данных, чтобы сказать, является ли объект новым или существующим.

Это не более элегантно, чем то, что вы оговорили, поэтому мне интересно, может ли кто-нибудь из ребят из Django или Rails предоставить какие-либо данные.

Мне нравится asp.net mvc, но он все еще созревает и все еще нуждается в добавлении сахара, чтобы убрать некоторые трения при создании веб-сайтов.

person Andrew Rimmer    schedule 20.08.2008

Лично я предпочитаю использовать if / else прямо в поле зрения. Это помогает мне сразу видеть все происходящее.

Если вы хотите избежать супа из тегов, я бы предложил создать вспомогательный метод.

<%= Helper.ProfessionField() %>

string ProfessionField()
{
    if(IsNewItem) { return /* some drop down code */ }
    else { return "<p>" + _profession+ "</p>"; }        
}
person Jim    schedule 20.08.2008

Вы можете указать класс CustomViewData и передать здесь параметры.


public class MyViewData {
    public bool IsReadOnly { get; set; }
    public ModelObject MyObject { get; set; }
}

И оба представления должны реализовывать эти ViewData. В результате вы можете использовать предоставленное свойство IsReadOnly для управления результатом UserControl.

Поскольку контроллер использует это, вы можете выполнить модульное тестирование, а ваши представления не имеют реализации, поэтому вы можете соблюдать принципы MVC.

person labilbe    schedule 14.11.2008