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


13

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

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

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

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

  0

Да! Было бы неплохо иметь возможность использовать один и тот же вид для: добавления, редактирования и просмотра ... 14 ноя. 082008-11-14 17:56:24

4

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

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

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


2

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

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

<%= Helper.ProfessionField() %> 

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

5

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

Вот ваши 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"); 
} 
  0

Вместо того, чтобы повторять то, что вы сделали, я мог бы предложить вам отредактировать свой ответ, чтобы включить пример переключения поля для чтения только на экране редактирования, поскольку исходный вопрос задал вопрос об этом. 11 дек. 092009-12-11 13:55:54


1

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


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

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

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