Usando ASP.NET MVC, ¿cómo evitar escribir tanto la Vista Agregar como la Editar?


13

La vista Agregar y la vista Editar son a menudo increíblemente similares y no es necesario escribir 2 vistas. A medida que la aplicación evoluciona, harías los mismos cambios en ambos.

Sin embargo, generalmente hay diferencias sutiles. Por ejemplo, un campo puede ser de solo lectura una vez que se ha agregado, y si ese campo es una lista de abandono, ya no necesita esa lista en ViewData.

Entonces, ¿debo crear una clase de datos de vista que contenga toda la información para ambas vistas, donde, dependiendo de la operación que esté realizando, ciertas propiedades serán nulas?
¿Debo incluir la operación en los datos de la vista como una enumeración?
¿Debo rodear todas las diferencias sutiles con <% if (ViewData.Model.Op == Ops.Editing) {%>?

¿O hay una manera mejor?

  0

Sí! Sería bueno poder usar la misma vista para: Agregar, Editar y Ver ... 14 nov. 082008-11-14 17:56:24

4

No me gusta que las vistas sean demasiado complejas, y hasta ahora he tendido a tener vistas separadas para editar y agregar. Utilizo un control de usuario para almacenar los elementos comunes para evitar la repetición. Ambas vistas se centrarán en el mismo ViewData, y tengo un marcador en mis datos para decir si el objeto es nuevo o un objeto existente.

Esto no es más elegante de lo que usted ha estipulado, por lo que me pregunto si alguno de los tipos de Django o Rails puede proporcionar alguna información.

Me encanta asp.net mvc pero aún está madurando, y aún necesita más azúcar para eliminar parte de la fricción de crear sitios web.


2

Yo personalmente prefiero usar el if/else allí mismo en la vista. Me ayuda a ver todo lo que sucede a la vista a la vez.

Sin embargo, si desea evitar la sopa de etiquetas, le sugiero que cree un método de ayuda.

<%= Helper.ProfessionField() %> 

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

5

Es realmente muy fácil. Supongamos que está editando una publicación de blog.

Ésta es tu 2 acciones de nueva/editar:

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

    .... 

} 

Y aquí está el punto de vista:

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

y aquí está la acción Guardar que la vista se somete a:

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

En lugar de volver a publicar exactamente lo que ha hecho, le sugiero que edite su respuesta para incluir un ejemplo de alternar un campo para que sea de solo lectura en la pantalla de edición, como la pregunta original que se hizo al respecto. 11 dic. 092009-12-11 13:55:54


1

Puede especificar una clase CustomViewData y pasar los parámetros aquí.


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

Y ambas vistas deben implementar este ViewData. Como resultado, puede usar la propiedad proporcionada IsReadOnly para administrar el resultado de UserControl.

Como el controlador usa esto, puede probarlo en una unidad y sus vistas no tienen implementación, por lo que puede respetar los principios de MVC.