4

私はまだ MVC に慣れていて、ビジュアル表示に多くの「タイル」(標準化されたヘッダーといくつかのコンテンツを持つ通常の「長方形セクション」パターン) を使用するサイトに取り組んでいます。レイアウトとナビゲーションを容易にするためにコンテンツをボックスに入れる方法にすぎません。現在、「タイル」(私の用語) は次のように構築されています。

<div class="tile">
    <div class="tile-header">
        <h2>Title</h2>
    </div>
    <div class="tile-body">
        (arbitrary content)
    </div>
</div>

注: 「任意のコンテンツ」とは、静的または動的なコンテンツを意味するため、必ずしも変数にプラグインしてヘルパーに渡すことができるものではありません。もう少し柔軟性が必要です。

私の質問は、このパターンをカプセル化し、コードからの呼び出しをより簡単/より表現力豊かにするために使用する最適な方法は何ですか? 部分ビューについては知っていますが、任意の本文コンテンツを部分ビューに渡すにはどうすればよいですか? (これは単に MVC 表示に関する私の限られた知識かもしれません)

次のような Razor ヘルパーを作成してみました。

@Tile.Begin("Title")
    (arbitrary content)
@Tile.End()

しかし、「タイル本体」の終了 div を含めることができないため、Razor がチョークします。(そうする場合、本文の内容を文字列変数として渡す必要があり、それが常に実現できるとは限りません)

私はこのようなものを見ることができました:

@using (Tile.Begin("Title")) {
    (arbitrary content)
}

@Tile.Begin() および @Tile.End() 呼び出しほど簡単ではありませんが、これは私には最もエレガントに思えます。私が理解していることからすると、クラスを作成して IDisposable を実装する必要がありますが、ヘルパー クラスから生の HTML タグの文字列を返そうとすると、エンコードされたタグ構文が画面に表示されるだけだったので、ここで同じ問題?

アドバイスをありがとう。:)

4

1 に答える 1

1

そうですね、動的なタイル生成には Display/EditorTemplates を使用することをお勧めします。それらを html ヘルパー (かみそりヘルパーではない) と組み合わせることもできます。

カスタム html ヘルパーの問題は、正しく実行していないことでした。HtmlHelper オブジェクトを使用する必要があります。正しい方法は次のようなものです。

public static class TileExtension {

    public static TileHelper Tile(this HtmlHelper helper, string title) {
        helper.ViewContext.Writer.Write(
            "<div class=\"tile\"><div class=\"tile-header\"><h2>" + title + "</h2></div>"
            + "<div class=\"tile-body\">"
        );
        return new TileHelper(helper);
    }

    private class TileHelper : IDisposable {
        private HtmlHelper _helper;
        public TileHelper(HtmlHelper helper) { _helper = helper; }
        public void Dispose() {
           _helper.ViewContext.Writer.Write("</div></div>");
        }
    }
}

次に、これを次のように使用します@using(Html.Tile("Title")) { // your content }

static キーワードと、パラメーターでのキーワードの使用に細心の注意を払うようにthisしてください。これらは、拡張機能を機能させるために必要です。

また、このクラスを作成した名前空間を web.config の pages/namespaces 要素に追加する必要があります。

<pages>
    <namespaces>
        <add namespace="My.Name.Space" />
    </namespaces>
<pages>
于 2012-10-23T20:49:52.660 に答える