2009-07-12 7 views
6

私はASP .Net MVCの新機能です。先週ApressからPro ASP .NET MVC Frameworkの本を購入しました。これは非常に有用であることが証明されています。ビューにマジック文字列を含まないASP MVCアプリケーションを構築することはできますか?

私がこれまで見てきた問題は、ほぼすべてのサンプルビューが魔法の文字列で詰まっていることです。私はいくつかの選択肢を見つけ出すことに成功しましたが、コードはちょっと読みにくくなってきました。たとえば:

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

は次のようになります。

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

RemoveFromCartへの最初のパラメータはModelBinder経由のセッションから引き出さ、それは読むために直感的ではありませんされているので、私は、この例で逃げることができます。

私の心配は、私がマジックストリングを避けるためにフレームワークと戦うために時間を費やすことであり、その過程でマークアップするのはそれが読みにくいことです。人々の経験ではこれは有効な関心事であり、 "安全なメソッドをタイプする"ルックアップテーブルには "マジックストリングメソッド"があるウェブ上の参照がありますか?

+0

各ビューのThunderdome Style ViewModelを使用して、厳密に型指定されたビューを作成しました。これはスコット・ガスリー氏によって書かれたものです。 – KingNestor

+0

私は同意しますが、強く型付けされたビューは最高のブームです。 –

答えて

5

T4MVCとMVC Futuresを使用することで、マジックストリングの99%を簡単に排除できます。先物ものはHTMLヘルパーを強く型付けされていながら、それらのプロジェクトの

の両方が、http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471

T4MVCはコントローラ、アクション、およびルーティングの世話をしますからご利用いただけます。 MVCContribプロジェクトは、いくつかの強く型付けされた流暢なHTMLビルダーを含んでいるので、見るべき別のプロジェクトです。

4

私が興味を持ってLosTechiesから、このブログの記事をお読みください。

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

これに、魔法の文字列のproductIDを含む:

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


A new breed of magic strings in ASP.NET MVC

彼らは、これを変更することをお勧めProductIdは現在強く型付けされています。

それとも、代わりに匿名の1の実際のオブジェクトを作成することができます。

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

しかし今、あなたはこれを必要とする:

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

彼らの最後の提案は、流れるようなインターフェイスを使用することです。

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

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

...と、この:(少し冗長であれば)かなりきれいに見えますが、それはこれを必要とする
Url.Action<ProductsController>(x => x.Edit(null, null), 
    Params.Product(product).Customer(customer)) 

:あなたはこれを書くことができます.and:

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

私はこれを見ることができましたそれがジェネリックを使って書くことができれば働くので、一度だけ書く必要があります。

関連する問題