@{
int i = 0;
}
@helper Text() {
<input type="text" name="Ans[@i].Text" />
}
i
ヘルパーではアクセスできません。アクセス方法は?
@{
int i = 0;
}
@helper Text() {
<input type="text" name="Ans[@i].Text" />
}
i
ヘルパーではアクセスできません。アクセス方法は?
@functions宣言を使用して、ページにメンバーとして簡単に追加できます。
@functions
{
private int i;
}
パラメータとしてヘルパーに渡すことができます:
@helper Text(int i) {
<input type="text" name="Ans[@i].Text" />
}
その後:
@{
int i = 0;
}
@SomeHelper.Text(i)
または、すべてを処理してそれらのヘルパーを取り除くエディター テンプレートを使用することもできます。例えば:
@Html.EditorFor(x => x.Ans)
これは、ビューの基本クラスを変更することで実現できます。このシナリオは、ヘルパーがビューで宣言されている状況に適用されます。
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" />
}
これにより、少なくとも共有ページ データの制約が提供されますが、値の型を制御することはできません。