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

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

Однако обычно есть небольшие различия. Например, поле может быть доступно только для чтения после того, как оно было добавлено, и если это поле является 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 ?

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

Да! Было бы неплохо иметь возможность использовать одно и то же представление для: добавления, редактирования и просмотра ...

Filip Frącz 14.11.2008 20:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
1
1 325
4

Ответы 4

Мне не нравится, что представления становятся слишком сложными, и до сих пор я имел тенденцию иметь отдельные представления для редактирования и добавления. Я использую пользовательский элемент управления для хранения общих элементов, чтобы избежать повторения. Оба представления будут сосредоточены вокруг одних и тех же 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");
}

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

Chris 11.12.2009 16:55

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


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

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

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

Другие вопросы по теме