2009-07-27 35 views
2

ASP.NET MVCビューは、以下のような難しい三項演算子ステートメント(デモ目的のみ)や同様の構文を含む、長いインラインC#コードにつながるものを条件付きで表示する必要があることが多いため、複雑になっています。ASP.NET MVC:ビューの処理量とヘルパーメソッドを使用する時間

<%= Model.SupportsFeature ? Model.HasName ? "This model supports the feature and has a name" : "This model supports the feature and has no name" : "This model doesn't support the feature" %> 

は今、私は、ビュー内のロジック、または私が代わりにすべきである(まだビュー関連)、これを維持する必要があります:

1)のHtmlHelper GetSupportedText(この...拡張メソッドを書く

2)実際のModelクラスに拡張メソッドを記述しますか?

私はコードを簡潔に保ち、関連するものをまとめているようにしていますが、これをどのように構造化して、<%%で混乱しているビューを扱うかは分かりません。

あなたのご意見ありがとうございます!

EDIT: 私も(文字列として)C#のヘルパーメソッドからHTMLを出して心配です - それは本当に醜いをデバッグするのは難しいです。

答えて

3

String.Format()または文字列連結を使用する場合は、TagBuilderクラスを使用してHTML文字列を作成できます。非常に複雑なHTMLにもSystem.Xml.Linqクラスを使用しました。

私が従う一般的なルールは次のとおりです。「ifがある場合は、HTMLヘルパーを作成してください。」私はその声明のクレジットを請求することはできませんが、私はそれをどこで聞いたか覚えていません。このルールはHTMLヘルパー拡張の爆発を引き起こすので、私は拡張を名前空間で整理します。私はweb.configに追加するビューの間で共有される拡張名前空間を作成し、それぞれのビューに対して使用するビュー固有の拡張コードファイルと名前空間を作成します。これにより、論理的な方法でコードを整理し、不必要なヘルパーが必要ないHTMLオブジェクトを混乱させることなく、拡張機能の場所を見つけることがはるかに簡単になります。

ここでは、デフォルトのアプリ名MvcApplication1を使用した例です。すべてのビューで私の共有ヘルパーを含めるようにweb.configファイルに追加しました

<pages> 
    <namespaces> 
    <add namespace="MvcApplication1.Helpers.Shared"/> 
    </namespaces> 
</pages> 

これは、ホーム/ About.aspxのための私のビュー固有のヘルパーの簡略化と不自然な例です。

namespace MvcApplication1.Helpers.About 
{ 
    public static class AboutViewExtensions 
    { 
     public static string AboutViewHelper(this HtmlHelper Html) 
     { 
      var tb = new TagBuilder("b"); 
      tb.SetInnerText("bold text"); 
      return tb.ToString(TagRenderMode.Normal); 
     } 
    } 
} 

は、ここに私の名前空間に持って<%@ Import %>ディレクティブを使用してAbout.aspxビューです。

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> 
<%@ Import Namespace="MvcApplication1.Helpers.About" %> 

<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2>About</h2> 
    <p> 
     <%= Html.AboutViewHelper() %> 
    </p> 
</asp:Content> 
4

ViewModelアプローチを使用している場合は、このロジックをViewModelのメソッド/ゲッターに張り付けることができます。

2

これはヘルパークラスになります。これは、拡張メソッドとして使用することをお勧めします。そこには、ローカリゼーションを適用することもできます(必要な場合)。

もう1つの方法は、これを行う(条件付きメッセージを出力する)新しいプロパティを作成することです(共有クラスを使用してこれをLinqからSQLに生成する)。こうすることで、他の出力(JSONなど)でプロパティを使用することができます。

ボトムライン - 何が効いているのですか?ビューから条件付きのものを削除するのは間違いありません。デバッグは難しすぎます。あなたがそれをモデル上に投げれば、それをテストすることもできます:)

+0

私はそれが必要なHTMLなしで(上記の例のように)テキスト出力のみを含むなら、提案した新しいプロパティが良いと思います。しかし、それはHTMLを含む場合、おそらくヘルパークラスは良いでしょう。 – Alex

関連する問題