ASP.NET MVC Razor语法错误

时间:2010-12-02 12:50:40

标签: c# razor asp.net-mvc-3

我如何将此代码转换为razor语法:

<% for (int i = 0; i < items.Length; i++)  %>
<%{
    if (i % 3 == 0)
    { %>
      <tr>
 <% } %>
    <td><a href="<%: url[i] %>"><%: title[i] %></a></td>           
 <% if (i % 3 == 2)
    { %>
      </tr>        
 <% } %>
<%} %>

我试试,但没有成功:

@for (int i = 0; i < items.Length; i++) 
{
    if (i % 3 == 0) 
    { 
        <tr>
    }
    <td><a href="@(url[i])">@(title[i])</a></td>
    if (i % 3 == 2) 
    {
        </tr>
    }
}

4 个答案:

答案 0 :(得分:5)

我找到了解决方案:

    @for (int i = 0; i < items.Length; i++)
{
    if (i % 3 == 0)
    {
@:<tr>
    }
    <td><a href="@url[i]"><img height="@(48 * Scale.Value)" width="@(48 * Scale.Value)" src="/i@(Scale.Value)/@(items[i]).png"/><span>@text[i]</span></a></td>
    if (i % 3 == 2)
    {
@:</tr>
    }
}

这是我ntroduction to razor syntax,但是:

  

使用@:运算符或<text>   元件。 @:输出一行   包含纯文本或   无与伦比的HTML标签;该   element包含多行   输出。这些选项非常有用   你不想渲染HTML   元素作为输出的一部分。

我不知道,为什么<text>现在正在工作。也许是因为剃刀仍然是RC,而不是发布

答案 1 :(得分:4)

其他一些答案对于计数不能被3整除的列表无效。这是我认为更好的解决方案

@for(int i=0 ; i < items.Length ; ) {
    <tr>
        @for(int maxInRow = i+3 ; i < items.Length && i<maxInRow ; i++) {
            <td><a href="@url[i]">@title[i]</a></td>
        }
    </tr>
}

答案 2 :(得分:1)

您可以使用<text>标记或IHtmlString,如下所示:

@for (int i = 0; i < items.Length; i++) 
{
    if (i % 3 == 0) 
    { 
        <text><tr></text>
    }
    <td><a href="@(url[i])">@(title[i])</a></td>
    if (i % 3 == 2) 
    {
        @MvcHtmlString.Create("</tr>")        
    }
}

修改

在我的网站上,我解决了这样的问题:

创建一个以模板为参数的函数:

@functions {
    public IHtmlString conditionalTag(bool condition, string tag, Func<object, HelperResult> template) {
        var startTag = condition ? string.Format("<{0}>", tag) : "";
        var endTag = condition ? string.Format("</{0}>", tag) : "";
        return new HtmlString(string.Format("{0}{1}{2}", startTag, template(null).ToString(), endTag));
    }
}

您可以像这样调用此函数:

@for (int i = 0; i < items.Length; i++) 
{
    @conditionalTag(i % 3 == 0, "tr", @<text>
       <td><a href="@(url[i])">@(title[i])</a></td>
    </text>)
 }

答案 3 :(得分:0)

我还没有使用过Razor,但我很确定你可以通过过滤掉只输出行标签的列表元素来大大简化代码。这样做的一种方法就是增加它们。您也可以将Linq与Where子句一起使用。它看起来更像是这样:

@for (int i = 1; i < items.Length; i+=3) 
{ 
<tr> 
    <td><a href="@url[i]"><img height="@(48 * Scale.Value)" width="@(48 * Scale.Value)" src="/i@(Scale.Value)/@(items[i]).png"/><span>@text[i]</span></a></td> 
</tr> 
} 

我猜这个视图引擎也可能更好,因为它可以看到每个开始标记与结束标记匹配。