在帮助程序中访问全局页面变量

时间:2012-10-17 20:57:37

标签: asp.net-mvc-3 razor

@{
    int i = 0;
}

@helper Text() {
    <input type="text" name="Ans[@i].Text" />
}
帮助程序无法访问

i。如何访问它?

3 个答案:

答案 0 :(得分:102)

您只需使用 @functions 声明将其作为成员添加到您的页面:

@functions
{
    private int i;
}

答案 1 :(得分:11)

您可以将其作为参数传递给帮助者:

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

然后:

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

或者您可以简单地使用编辑器模板来处理所有事情并摆脱这些帮助。例如:

@Html.EditorFor(x => x.Ans)

答案 2 :(得分: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,因此不支持智能感知。作为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" />
}

这至少为共享页面数据提供了约束,但仍无法控制值类型。