【问题标题】:Syntax for ASP.Net MVC Phil Haack's Repeater syntax using Razor (MVC 3)?使用 Razor (MVC 3) 的 ASP.Net MVC Phil Haack 的中继器语法的语法?
【发布时间】:2011-05-25 13:08:40
【问题描述】:

我最近开始使用 ASP.Net MVC 3 RC 2,并尝试使用 Razor 语法迁移 MVC 2 中的现有网站。在 MVC 2 应用程序中,我使用了 Phil Haack 在下面提供的代码库转发器: Phil Haack's Code Based Repeater

我的问题是关于 Razor 的语法。我不明白如何在 Razor 中重写以下块中的模板,并且找不到任何文档来提供帮助(文档的早期或我的简单性......):

<% Html.Repeater<ObjectToUse>(Model, "", "alt", (item, css) =>
   { %>
        <tr class="<%= item.Enabled ? css : "disabled" %>">
            <td><%= item.Name%></td>
            <td><%= item.Description%></td>
            <td><%= Html.RouteLink("Edit", item.ObjectToUseRouteValues("Edit"))%></td>
            <td></td>
            <td><%= Html.RouteLink("Select", item.ObjectToUseRouteValues())%></td>
        </tr>
<% }); %>

在大括号(tr)之间应用模板时会出现问题。我曾尝试使用 WebGrid 控件,但它不提供设置“禁用”行所需的功能(我认为)。

【问题讨论】:

    标签: syntax asp.net-mvc-3 razor


    【解决方案1】:

    我写了@helper 版本。 @helper 不要使用泛型方法。

    @helper ForEach(IEnumerable<int> items, Func<object, HelperResult> template){
        foreach(var item in items){
            Write(template(item));
        }
    }
    <div>
    <ul>
    @ForEach(Enumerable.Range(1,5),
        @<li>@item</li>
    )
    </ul>
    </div>
    

    希望这个代码。

    【讨论】:

      【解决方案2】:

      实际上,现在我想多了,我认为您不能在 Razor 中使用 Action 那样的参数。我记得以前遇到过这种情况。

      更新

      Andrew Nurse 的回答是: "不幸的是,这是当前解析器的设计,但我应该指出,我们希望对其进行改进。问题是标记仅在语句开头有效(从技术上讲,这是您已经说得好),但我们的 C#“解析器”目前还不够智能,无法检测 lambdas。"

      虽然这可能已经过时了:)

      @Html.Repeater(Model, "row", "row-alt", 
          @<tr class="@item.ClassType : "disabled"">
              <td>@item.Name</td>
              <td>@item.Description</td>
              <td>@Html.RouteLink("Edit", item.ObjectToUseRouteValues("Edit"))</td>
              <td></td>
              <td>@Html.RouteLink("Select", item.ObjectToUseRouteValues())</td>
          </tr>
      )
      
          public static IHtmlString Repeater<T>(this HtmlHelper html, IEnumerable<T> items,
               string className, string classNameAlt, Func<T, HelperResult> render) {
              if (items == null)
                  return new HtmlString("");
      
              int i = 0;
              StringBuilder sb = new StringBuilder();
              foreach (var item in items) {
                  item.ClassType = item.Enabled ? (i++ % 2 == 0 ? className : classNameAlt) : "disabled";
                  sb.Append(render(item).ToHtmlString());
              }
      
              return new HtmlString(sb.ToString());
          }
      
      }
      

      【讨论】:

      • 嗨,我试过这个,但问题在于编译器如何感知委托函数中的 html。它似乎不像在 c# aspx 实现中那样识别它。因此,在 { } 之间,它将它们视为随机的文本片段,而不是字符串。
      • 已更新,我认为不可能
      • 最好问问 Haacked...恐怕我的回答很烂
      • 这是正确的,不幸的是我们现在没有足够聪明的解析器来检测 lambdas。 可以重写帮助程序以使用内联模板语法,事实上,我就是这样做的:blog.andrewnurse.net/2010/08/02/InsideRazorPart3Templates.aspx
      • 谢谢,我很确定是这样,但我并不完全有信心 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 2011-04-11
      相关资源
      最近更新 更多