在助手访问全局页变量(Access global page variable in helper)

2019-08-01 14:32发布

@{
    int i = 0;
}

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

i是不是在帮助访问。 如何访问呢?

Answer 1:

你可以简单地将其作为成员通过使用@functions声明添加到您页:

@functions
{
    private int i;
}


Answer 2:

你可以把它作为参数传递给帮手:

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

然后:

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

或者你可以简单地使用,这将照顾一切,并摆脱那些佣工的编辑模板。 例如:

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


Answer 3:

你可以通过改变基类为视图实现这一目标。 此方案适用于其中帮手鉴于申报的情况。

创建从继承的基类WebViewPage和介绍共享字段或属性:

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

    public override void Execute()
    { }
}

使用@inherits指令改变基类。 而现在字段/属性既是从“页面上下文”和辅助acessible:

@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" />
}

这至少提供约束共享页的数据,但仍超过值类型没有控制权。



文章来源: Access global page variable in helper