Используя ASP.NET MVC, как лучше избежать написания как Add View, так и Edit View?

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

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

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

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

20.08.2008 20:34:12
Да уж! Было бы неплохо иметь возможность использовать один и тот же вид для: добавления, редактирования и просмотра ...
Filip Frącz 14.11.2008 17:56:24
4 ОТВЕТА

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

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

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

4
20.08.2008 21:18:52

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

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

<%= Helper.ProfessionField() %>

string ProfessionField()
{
    if(IsNewItem) { return /* some drop down code */ }
    else { return "<p>" + _profession+ "</p>"; }        
}
2
20.08.2008 22:02:52

Это довольно легко на самом деле. Давайте предположим, что вы редактируете сообщение в блоге.

Вот ваши 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");
}
5
3.09.2008 15:01:12
Вместо того, чтобы перепечатывать в точности то, что вы сделали, я мог бы предложить вам отредактировать свой ответ, включив в него пример переключения поля, доступного только для чтения, на экране редактирования, как было задано в первоначальном вопросе.
Chris 11.12.2009 13:55:54

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


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

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

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

1
14.11.2008 17:46:55