Asp.net mvc 3 访问帮助程序中的全局页面变量 @{ int i=0; } @辅助文本(){ }

Asp.net mvc 3 访问帮助程序中的全局页面变量 @{ int i=0; } @辅助文本(){ },asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,i在帮助程序中不可访问。如何访问它?您可以通过更改视图的基类来实现这一点。此场景适用于在视图中声明helper的情况 创建继承并引入共享字段或属性的基类: @{ int i = 0; } @helper Text() { <input type="text" name="Ans[@i].Text" /> } 如果您想拥有一个接近术语“页面属性/字段”但不想创建基类的东西,或者助手存储在App\u code文件夹中,那么您可以尝试使用属性 MSDN:提供类似属性的

i
在帮助程序中不可访问。如何访问它?

您可以通过更改视图的基类来实现这一点。此场景适用于在视图中声明helper的情况

创建继承并引入共享字段或属性的基类:

@{
    int i = 0;
}

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

如果您想拥有一个接近术语“页面属性/字段”但不想创建基类的东西,或者助手存储在
App\u code
文件夹中,那么您可以尝试使用属性

MSDN:提供类似属性的访问权限,以访问彼此共享的页面数据 页面、布局页面和部分页面

这种情况下的代码是:

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

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

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

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

// 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" />
}
或者你可以简单地使用编辑器模板,它会处理所有的事情,并摆脱那些助手。例如:

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

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

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

不能将声明移到更接近使用的位置吗?我认为您的问题是变量超出了范围。可以在helper之外使用变量,但在helper中不可能。我不能把它搬进去。唯一的解决方案是作为参数传递,但这不是很好。我不同意“非常好”,这可能是您唯一的选择。您所做的事情是否必须在助手中?是否可以将其粘贴在ViewBag或ViewData collections中?将
i
传递给助手。或者尝试使用
哇。。。这个太棒了!谢谢分享……:)救了我。如果我将
int
参数传递给帮助器并在那里增加它,那么尝试在帮助器外部读取它;它具有初始值,因为
int
是一种值类型(副本作为参数传递,而不是原始int ref)。在Razor's helper中,也不能使用
ref int
,因为helper本质上是lambda表达式:@LenielMacaferi,感谢您在评论中提到
ref
。。。我怀疑是这样的,但你帮了我更多的挖掘。这是一个极好的答案。这更符合问题的要求,这正是我所需要的。我需要能够更改助手中的值。这是我需要的一件愚蠢的事情,制作视图模型或做任何复杂的事情都没有意义。回答得好!请注意,您不能从那里访问模型Hello@Darin,我想从我的“@helper”中获取更改后的值。我不能使用ref,还有,如何解决它。
@helper Text(int i) {
    <input type="text" name="Ans[@i].Text" />
}
@{
    int i = 0;
}
@SomeHelper.Text(i)
@Html.EditorFor(x => x.Ans)
@functions
{
    private int i;
}