Представления «Добавить» и «Редактировать» часто невероятно похожи, поэтому создание двух представлений неоправданно. По мере развития приложения вы будете вносить одинаковые изменения в оба.
Однако обычно есть небольшие различия. Например, поле может быть доступно только для чтения после того, как оно было добавлено, и если это поле является DropDownList, вам больше не нужен этот список в ViewData.
So, should I create a view data class which contains all the information for both views, where, depending on the operation you're performing, certain properties will be null?
Should I include the operation in the view data as an enum?
Should I surround all the subtle differences with ?
Или есть способ лучше?





Мне не нравится, что представления становятся слишком сложными, и до сих пор я имел тенденцию иметь отдельные представления для редактирования и добавления. Я использую пользовательский элемент управления для хранения общих элементов, чтобы избежать повторения. Оба представления будут сосредоточены вокруг одних и тех же ViewData, и у меня есть маркер на моих данных, чтобы сказать, является ли объект новым или существующим.
Это не более элегантно, чем то, что вы оговорили, поэтому мне интересно, может ли кто-нибудь из ребят из Django или Rails предоставить какие-либо данные.
Мне нравится asp.net mvc, но он все еще созревает и все еще нуждается в добавлении сахара, чтобы убрать некоторые трения при создании веб-сайтов.
Лично я предпочитаю использовать if / else прямо в поле зрения. Это помогает мне сразу видеть все происходящее.
Если вы хотите избежать супа из тегов, я бы предложил создать вспомогательный метод.
<%= Helper.ProfessionField() %>
string ProfessionField()
{
if (IsNewItem) { return /* some drop down code */ }
else { return "<p>" + _profession+ "</p>"; }
}
На самом деле это довольно просто. Предположим, вы редактируете сообщение в блоге.
Вот ваши 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");
}
Вместо того, чтобы репостить именно то, что вы сделали, я мог бы предложить вам отредактировать свой ответ, включив в него пример переключения поля на доступное только для чтения на экране редактирования, как в исходном вопросе.
Вы можете указать класс CustomViewData и передать здесь параметры.
public class MyViewData {
public bool IsReadOnly { get; set; }
public ModelObject MyObject { get; set; }
}
И оба представления должны реализовывать эти ViewData. В результате вы можете использовать предоставленное свойство IsReadOnly для управления результатом UserControl.
Поскольку контроллер использует это, вы можете выполнить модульное тестирование, а ваши представления не имеют реализации, поэтому вы можете соблюдать принципы MVC.
Да! Было бы неплохо иметь возможность использовать одно и то же представление для: добавления, редактирования и просмотра ...