【问题标题】:Access global page variable in helper在帮助程序中访问全局页面变量
【发布时间】:2012-10-08 05:42:37
【问题描述】:
@{
    int i = 0;
}

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

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

【问题讨论】:

  • 声明不能更接近使用吗?我认为您的问题是变量超出范围。
  • 可以在 helper 之外使用变量,但在其中是不可能的。我不能把它移进去。唯一的解决方案是作为参数传递,但这不是很好。
  • 我不同意它“非常好”,它可能是您唯一的选择。你正在做的事情必须在助手中吗?
  • 你能把它放在 ViewBag 或 ViewData 集合中吗?
  • i 传递给助手。或者尝试使用&lt;input type="text" name="Ans[@(i)].Text" /&gt;

标签: asp.net-mvc-3 razor


【解决方案1】:

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

@functions
{
    private int i;
}

【讨论】:

  • 哇...这个太棒了!感谢分享... :) 救了我。如果我将int 参数传递给助手并在那里增加它,然后尝试在助手之外读取它;它具有初始值,因为int 是一个值类型(副本作为参数传递,而不是原始的 int ref)。在 Razor 的助手中,也不能使用 ref int,因为助手本质上是 lambda 表达式:blog.slaks.net/2011/02/dissecting-razor-part-7-helpers.html
  • @LenielMacaferi 并感谢您在评论中提到ref...我怀疑是这样,但您为我节省了更多的挖掘工作。
  • 这是一个绝妙的答案。这更符合问题的要求,这正是我所需要的。我需要能够更改我的助手中的值。这是我需要的一件愚蠢的事情,制作视图模型或做任何复杂的事情都没有意义。很好的答案!
  • 请注意,您无法从那里访问模型
【解决方案2】:

你可以将它作为参数传递给助手:

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

然后:

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

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

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

【讨论】:

  • 你好@Darin,我想从我的'@helper'中取回更改后的值,我无法使用 ref 和那里,如何解决它。
【解决方案3】:

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

创建一个继承自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" />
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多