c# - tutorial - Usando ASP.NET MVC, ¿cómo evitar escribir tanto la Vista Agregar como la Editar?
que es razor (4)
La vista Agregar y la vista Editar son a menudo increíblemente similares que 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, ¿debería 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?
¿Debería incluir la operación en los datos de la vista como una enumeración?
¿Debería rodear todas las diferencias sutiles con <% if (ViewData.Model.Op == Ops.Editing) {%> ?
¿O hay un mejor camino?
Es bastante fácil en realidad. Supongamos que está editando una publicación de blog.
Aquí están sus 2 acciones para 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);
}
....
}
Y aquí está la 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 a la que se envía la vista:
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");
}
No me gusta que las Vistas sean demasiado complejas, y hasta ahora tendí 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 has estipulado, por lo que me pregunto si alguno de los tipos de Django o Rails puede aportar algo.
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.
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 deberían implementar este ViewData. Como resultado, puede usar la propiedad IsReadOnly provista para administrar el resultado de UserControl.
A medida que 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.
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>"; }
}