ASP.NET MVC Razor синтаксическая ошибка - PullRequest
3 голосов
/ 02 декабря 2010

как я могу перевести этот код в синтаксис бритвы:

<% 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 ]

5 голосов
/ 02 декабря 2010

Я нашел решение:

    @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>
    }
}

вот я введение в синтаксис бритвы , но:

Используйте оператор @: или <text> элемент. @: Выводит одну строку содержания, содержащего простой текст или непревзойденные теги HTML; элемент заключает в себе несколько строк выход. Эти параметры полезны, когда Вы не хотите отображать HTML элемент как часть вывода.

Я не знаю, почему <text> сейчас работает. может потому что бритва все-таки RC, а не релиз

4 голосов
/ 02 декабря 2010

Некоторые другие ответы не работают корректно со списками, число которых не делится на 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>
}
1 голос
/ 02 декабря 2010

Вы можете использовать тег <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>)
 }
0 голосов
/ 02 декабря 2010

Я еще не работал с 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> 
} 

Я предполагаю, что движок представления тоже может быть лучше с этим, потому что он может видеть, что каждый открывающий тег соответствует закрывающему тегу.

...