1

私は Razor を使い始めたばかりで、最初はヘルパーを .ACSX のように扱いたいと思っていました。

非常に単純なヘルパーを作成するとします。

@helper HowManySpans() {
<div>
<input type="text" name="txtLoops" /><input type="submit" value="how many?" />
@{ if (IsPost) {
    var count = Request["txtLoops"];
    var i = 1;
    while (i < count) {
       <span>Span #@i</span>
       i++;
       }
   }
</div> 
}

同じページに2つ配置するまでは問題なく動作します。ASPXページが一般的に行うように、コンパイラがプレフィックス付きの要素の名前を出力することを期待していました.yknow、ctl00_Header_txtLoopsなど。

より引数駆動型のヘルパーでは、自分の引数を使用して自分の名前にプレフィックスを付けることができると思いますが、それでも問題が延期されると感じています。名前の前に特定の引数を付ける動的ヘルパーがあったとしても、その引数を持つページには 1 つしか存在できませんでした。

私は痛々しいほど明白な何かを見落としていますか?

4

1 に答える 1

1

Razor は、ページ内のマークアップのみを発行します。マークアップを拡張する方法はほとんどありません。Razor v2 は条件付き属性を追加しましたが、開発者に代わってまだいくらか明示的です。

私が持っている 1 つの質問は、なぜ要素に一意の名前が必要なのかということです。多くの最新の HTML5 アプリケーションでは、要素に一意の名前を付ける必要はほとんどありません。

しかし、必要があると仮定すると、それを行うために私が考えることができる2つの方法があります。

  1. 発信者に名前または名前のプレフィックスを渡してもらいます(提案したとおり)。
  2. 独自のカウンターを作成し、ヘルパーが呼び出されるたびにインクリメントします。大きな問題は、カウンターの情報をどこに保存するかです。それを保存する論理的な場所の 1 つは、要求ごとの「データのバッグ」である HttpContext.Items コレクションです。ヘルパーが呼び出されるたびに、Items バッグをチェックして現在のカウントが何であるかを確認し、それを 1 増やし、その数を使用してバッグを更新します。
于 2013-02-28T17:18:19.657 に答える