Как использовать лямбду в бритве MVC 3 - PullRequest
1 голос
/ 22 февраля 2012

У меня есть несколько таких кодов бритвы.


@{
    Layout = null;
    var Nav = ViewData["Nav"] as List<string>;
}
@{
    if(Nav!=null){
        Nav.ForEach(item =>
        {
            @<a>123@(item)</a>
        });
    }
}

но я вхожу в эти строки Ошибка:

Ошибка сервера в «/» приложении. Ошибка компиляции Описание: во время компиляции ресурса, необходимого для обслуживания этого запроса, произошла ошибка. Пожалуйста, просмотрите следующие конкретные подробности ошибки и измените свой исходный код соответствующим образом.

Compiler Error Message: CS1002: ; expected

Source Error:

Line 8:          {

Line 9:              @<a>123@(item)</a>

Line 10:         });

Line 11:     }

Line 12: }

Если я заменю метод ForEach блоком foreach, он будет работать хорошо.

foreach (var item in Nav)
{
    <a>@item</a>
}

Но я не люблю foreach, это выглядит так ужасно.
Как я могу использовать метод ForEach вместо блока foreach?

Ответы [ 3 ]

2 голосов
/ 22 февраля 2012
@if (Nav != null)
{
    Nav.ForEach(x =>
    {
        Func<object, HelperResult> res = @<a>123@(item)</a>;
        Write(res(x));
    });
}

Вы уверены, что это выглядит более читабельно, чем:

foreach (var item in Nav)
{
    <a>123@(item)</a>
}

В качестве альтернативы вы можете использовать Razor Делегированные помощники .

1 голос
/ 22 февраля 2012

Вот хорошая статья об использовании шаблонной лямбды в Razor: http://haacked.com/archive/2011/02/27/templated-razor-delegates.aspx

Есть пара проблем. Прежде всего, вам нужно указать, что вы пишете HTML в своей лямде, поэтому вам нужно явно позвонить Write или WriteTo на HelperResult. Кроме того, поскольку { } в вашей лямбде означает блок, вам необходимо завершить все строки точкой с запятой.

Попробуйте использовать что-то вроде расширения List от Haacked:

public static class RazorExtensions {
    public static HelperResult List<T>(this IEnumerable<T> items, 
      Func<T, HelperResult> template) {
        return new HelperResult(writer => {
            foreach (var item in items) {
                template(item).WriteTo(writer);
            }
        });
    }
}
0 голосов
/ 22 февраля 2012

Я думаю, это потому, что вы поместили два символа @ в одну и ту же строку, попробуйте выполнить следующее:

if(Nav!=null){
    Nav.ForEach(item =>
    {
        <a>123
         @(item)
        </a>
    });
}

Хоп, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...