Сведения о вопросе

rjevskii

15:46, 23rd August, 2020

Теги

c#   asp.net-mvc    

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

Просмотров: 483   Ответов: 4

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

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

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

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



  Сведения об ответе

9090

14:31, 7th August, 2020

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

Вот ваши 2 действия для new/edit:

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");
}


  Сведения об ответе

SEEYOU

21:21, 15th August, 2020

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

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

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


  Сведения об ответе

SEEYOU

19:08, 27th August, 2020

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

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

<%= Helper.ProfessionField() %>

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


  Сведения об ответе

VCe znayu

10:10, 2nd August, 2020

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


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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться