2009-07-12 6 views
6

Soy muy nuevo en ASP .Net MVC, compré el libro Pro ASP .Net MVC Framework de Apress la semana pasada y está resultando muy útil.¿Es posible construir una aplicación ASP MVC sin cadenas mágicas en las vistas?

El problema que estoy viendo hasta ahora es que casi todas las vistas de ejemplo están plagadas de cadenas mágicas. Me las he arreglado para encontrar algunas alternativas, pero el código comienza a ser un poco difícil de leer. Por ejemplo:

<% using(Html.BeginForm("RemoveFromCart", "Cart")){ %> 
    <%= Html.Hidden("ProductID", line.Product.ProductID) %> 
    <%= Html.Hidden("returnUrl", ViewData["returnRrl"]) %> 
    <input type="submit" value="Remove" /> 
<% } %> 

se convierte en:

<% using (Html.BeginForm<CartController>(c => c.RemoveFromCart(null, line.Product.ProductID, (string)ViewData["returnUrl"]))) { %> 
    <input type="submit" value="Remove" /> 
<% } %> 

puedo salirse con este ejemplo, debido a que el primer parámetro a RemoveFromCart se extrae de la sesión a través de una ModelBinder, pero no es intuitiva para leer.

Mi preocupación es que me voy a perder el tiempo luchando contra el framework para evitar cadenas mágicas y en el proceso terminar con marcas que es un dolor leer. En la experiencia de las personas, ¿es esto una preocupación válida y hay una referencia en la web donde hay un "método de cadena mágica" para "buscar métodos seguros" en la tabla de búsqueda?

+0

Vistas fuertemente tipadas, con Thunderdome Style ViewModel para cada vista. – KingNestor

+0

Estoy de acuerdo, las vistas fuertemente tipadas son la mejor opción para el dinero. –

Respuesta

5

Al usar T4MVC y MVC Futures, puede eliminar fácilmente el 99% de las cadenas mágicas.

Ambos de estos proyectos están disponibles en http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471

T4MVC se hará cargo de los controladores, acciones y enrutamiento, mientras que el material futuros ha introducido fuertemente ayudantes HTML. El proyecto MVCContrib es otro proyecto a considerar, ya que incluye algunos constructores de HTML con mucho tirón.

4

He leído con interés esta entrada del blog de LosTechies:
A new breed of magic strings in ASP.NET MVC

Sugieren cambiar esto:

Url.Action<ProductsController>(x => x.Edit(null), new { productId = prodId }) 

que contiene la cadena mágica productID, a esto:

Url.Action<ProductsController>(x => x.Edit(null), 
    new RouteValueDictionary { { ProductsController.ProductId, prodId } }) 

ProductId ahora está fuertemente tipado.

o puede crear un objeto real en lugar de un anónimo uno:

Url.Action<ProductsController>(x => x.Edit(null), 
    new EditProductParams { product = prodId }) 

Pero ahora lo que necesita esto:

public class EditProductParams 
{ 
    public Guid product { get; set; } 
} 

Su última sugerencia es utilizar una interfaz fluida. Puede escribir lo siguiente:

Url.Action<ProductsController>(x => x.Edit(null, null), 
    Params.Product(product).Customer(customer)) 

que se parece bastante limpio (aunque un poco redundante), pero requiere esto:

public static class Params 
{ 
    public static ParamBuilder Product(Product product) 
    { 
     var builder = new ParamBuilder(); 

     return builder.Product(product); 
    } 

    public static ParamBuilder Customer(Customer customer) 
    { 
     var builder = new ParamBuilder(); 

     return builder.Customer(customer); 
    } 
} 

... y esto:

public class ParamBuilder 
{ 
    private Product _product; 
    private Customer _customer; 

    public ParamBuilder Product(Product product) 
    { 
     _product = product; 
     return this; 
    } 

    public ParamBuilder Customer(Customer customer) 
    { 
     _customer = customer; 
     return this; 
    } 
} 

.. .y esto:

public static implicit operator RouteValueDictionary(ParamBuilder paramBuilder) 
{ 
    var values = new Dictionary<string, object>(); 

    if (paramBuilder._product != null) 
    { 
     values.Add("p", paramBuilder._product.Id); 
    } 

    if (paramBuilder._product != null) 
    { 
     values.Add("c", paramBuilder._customer.Id); 
    } 

    return new RouteValueDictionary(values); 
} 

Pude ver esto trabajando si se podría escribir utilizando genéricos, de modo que solo tendría que escribirse una vez.

Cuestiones relacionadas