@{
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
,因此不支持智能感知。作为替代Page
有另一个属性 - WebPageBase.PageData。
MSDN:提供对页面、布局页面和部分页面之间共享的页面数据的类似数组的访问。
在这种情况下,可以为“页面变量”创建一个包含字符串/整数键的类容器。代码如下:
// 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" />
}
这至少为共享页面数据提供了约束,但仍然无法控制值类型。