如何(轻松地)在Razor中动态命名helper元素?

如何(轻松地)在Razor中动态命名helper元素?,razor,html-helper,razor-2,Razor,Html Helper,Razor 2,我刚开始使用Razor,我的第一个倾向是像对待.ACSX一样对待助手 假设我是一个非常简单的助手: @helper HowManySpans() { <div> <input type="text" name="txtLoops" /><input type="submit" value="how many?" /> @{ if (IsPost) { var count = Request["txtLoops"]; var i = 1;

我刚开始使用Razor,我的第一个倾向是像对待.ACSX一样对待助手

假设我是一个非常简单的助手:

@helper HowManySpans() {
<div>
<input type="text" name="txtLoops" /><input type="submit" value="how many?" />
@{ if (IsPost) {
    var count = Request["txtLoops"];
    var i = 1;
    while (i < count) {
       <span>Span #@i</span>
       i++;
       }
   }
</div> 
}
@helper howmanyspan(){
@{if(IsPost){
变量计数=请求[“txtLoops”];
var i=1;
而(我<计数){
Span#@i
i++;
}
}
}
在我将两个元素放在同一个页面上之前,它工作得很好。我希望编译器发出前缀元素的名称,就像通常的ASPX页面、yknow、ctl00\u Header\u txtLoops或类似的东西一样

我想在一个更受参数驱动的助手中,我可以自己使用参数作为名称前缀,但我觉得这仍然会推迟问题的解决。如果我有一个动态助手在名称前面加上某个参数,我在一个页面上仍然只能有一个参数


我是否忽略了一些非常明显的东西?

Razor只发出页面中的标记。它在增加标记方面几乎没有什么作用。Razor v2添加了条件属性,但这对于开发人员来说仍然有点明确

我的一个问题是,为什么元素甚至需要唯一的名称。在许多现代HTML5应用程序中,元素几乎不需要唯一的名称

但是,假设有必要,我可以想出两种方法:

  • 让调用者传入名称或名称前缀(如您所建议的)
  • 创建您自己的计数器,并在每次调用帮助程序时递增它。最大的问题是保存计数器信息的位置。保存计数器信息的一个逻辑位置是HttpContext.Items集合,它是每个请求的“数据包”。每次呼叫助手时,它都会检查物品袋以查看当前计数,将其递增1,使用该数字,然后更新物品袋

  • Razor只发出页面中的标记。它在增加标记方面几乎没有什么作用。Razor v2添加了条件属性,但这对于开发人员来说仍然是明确的

    我的一个问题是,为什么元素甚至需要唯一的名称。在许多现代HTML5应用程序中,元素几乎不需要唯一的名称

    但是,假设有必要,我可以想出两种方法:

  • 让调用者传入名称或名称前缀(如您所建议的)
  • 创建您自己的计数器,并在每次调用帮助程序时递增它。最大的问题是保存计数器信息的位置。保存计数器信息的一个逻辑位置是HttpContext.Items集合,它是每个请求的“数据包”。每次呼叫助手时,它都会检查物品袋以查看当前计数,将其递增1,使用该数字,然后更新物品袋

  • 我明白了。我来自一个非MVC ASP.NET背景,不需要唯一名称的范例对我来说没有意义。我想,既然我从我的高级开发人员那里得到了基本相同的答案,为什么需要唯一名称,这是我自己的开发风格的一个障碍,我必须克服。@friggle是的,请不要假设有一个ID是错误的——这一点都没有错。更多的是关于需求和常见做法。最终你可以按照自己的意愿构建应用程序,如果应用程序最容易或最好有命名元素,那么就使用它。我明白了。我来自一个非MVC ASP.NET背景,不需要唯一名称的范例并不存在我想,既然我从我的高级开发人员w/r/t那里得到了基本相同的答案,为什么一个人需要唯一的名字,这是我自己开发风格的一个障碍,我必须克服。@friggle是的,请不要认为有ID是错误的-这真的一点都没有错。更多的是关于需要和常见的practices。最终,你可以随心所欲地构建应用程序,如果应用程序最容易或最好有命名元素,那么就使用它。