如何(轻松)动态命名Razor中的辅助元素?

时间:2013-02-28 16:24:34

标签: razor html-helper razor-2

我刚刚开始使用Razor,我的第一个倾向是将Helpers视为.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> 
}

在我将两个放在同一页面上之前一切正常。我期待编译器发出像ASPX页面一样的前缀元素的名称,yknow,ctl00_Header_txtLoops或类似的东西。

我想在一个更多参数驱动的帮助器中,我可以使用我的参数来自己添加名称,但我觉得这仍然会推迟这个问题。如果我有一些带有某个参数的前缀名称的动态助手,我仍然只能在一个带有该参数的页面上有一个。

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

1 个答案:

答案 0 :(得分:1)

Razor仅发出页面中的标记。它几乎没有增加标记的方式。 Razor v2添加了条件属性,但代表开发人员仍然有点明确。

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

但是,假设有需要,我可以通过两种方式来实现它:

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