55
@{
    int i = 0;
}

@helper Text() {
    <input type="text" name="Ans[@i].Text" />
}

iヘルパーではアクセスできません。アクセス方法は?

4

3 に答える 3

126

@functions宣言を使用して、ページにメンバーとして簡単に追加できます。

@functions
{
    private int i;
}
于 2013-03-15T20:05:22.580 に答える
12

パラメータとしてヘルパーに渡すことができます:

@helper Text(int i) {
    <input type="text" name="Ans[@i].Text" />
}

その後:

@{
    int i = 0;
}
@SomeHelper.Text(i)

または、すべてを処理してそれらのヘルパーを取り除くエディター テンプレートを使用することもできます。例えば:

@Html.EditorFor(x => x.Ans)
于 2013-02-24T14:45:38.847 に答える
4

これは、ビューの基本クラスを変更することで実現できます。このシナリオは、ヘルパーがビューで宣言されている状況に適用されます。

WebViewPageから継承し、共有フィールドまたはプロパティを導入する基本クラスを作成します。

public class MyBasePage<T> : WebViewPage<T>
{
    public int i;

    public override void Execute()
    { }
}

@inheritsディレクティブ変更基本クラスを使用します。フィールド/プロパティは、「ページ コンテキスト」とヘルパーの両方からアクセスできるようになりました。

@inherits NamespaceOfYourBaseClass.MyBasePage<YourModel>
@{
    i = 0;
}

@helper Text() {
    <input type="text" name="Ans[@i].Text" />
}

「ページプロパティ/フィールド」という用語に近いものが必要であるが、基本クラスを作成したくない場合、またはヘルパーがApp_Codeフォルダー内に格納されている場合は、WebPageBase.Pageプロパティを試すことができます。

MSDN : ページ、レイアウト ページ、および部分ページ間で共有されるページ データへのプロパティのようなアクセスを提供します。

この場合のコードは次のようになります。

@{
    Page.i = 0;
}

@helper Text() {
    <input type="text" name="Ans[@Page.i].Text" />
}

欠点は、Pageプロパティが型dynamicであるため、IntelliSense をサポートしていないことです。Page別のプロパティとしてWebPageBase.PageDataがあります。

MSDN : ページ、レイアウト ページ、および部分ページ間で共有されるページ データへの配列のようなアクセスを提供します。

この場合、「ページ変数」の文字列/int キーのクラス コンテナを作成できます。コードは次のようになります。

// class visible to views and helpers
class MyViewFields {
  public const string i = "MyViewFields.i"; // or maybe generate guid for key so there would be not doubts about its uniqueness.. but how would you debug this? :)
}

// in MyView.cshtml
@{
    PageData[MyViewFields.i] = 0
}

@helper Text() {
    <input type="text" name="Ans[@PageData[MyViewFields.i]].Text" />
}

これにより、少なくとも共有ページ データの制約が提供されますが、値の型を制御することはできません。

于 2013-02-24T14:39:20.850 に答える