Подтвердить что ты не робот

Являются ли лямбда-выражения поддерживаемыми Razor?

Поддерживаются ли лямбда-выражения/анонимные методы в механизме просмотра Razor?

Мне сложно выразить следующее в Razor:

@Model.ToList().ForEach(i =>
    {
        if (i.DealerName != null) 
        {
            <text> 
                @i.DealerName
            </text>
        }
    }

Примечание: Я знаю, что может решить это с помощью @foreach, но мне нужно аналогичное решение для стороннего MVC-управления. Он использует этот механизм для настройки содержимого элемента управления. Он отлично работает для просмотров MVC.ASPX, но не может заставить его работать с Razor.


MVC.ASPX-эквивалент (код, который я хотел бы преобразовать в синтаксис Razor):

<% Model.ToList().ForEach(i =>
       {
           if (i.DealerName != null)
           { 
           %> <%=i.DealerName%> <%
           };
       }); 
%>

Это для механизма Razor, который поставляется с ASP.NET MVC3.

4b9b3361

Ответ 1

Вместо блока <text>@i.DealerName</text> вы можете использовать Response.Write(i.DealerName);

Результат будет таким же, как если бы вы отбросили его на странице Razor - он будет выполняться на странице рендеринга.. И, честно говоря, я уверен, что это то, во что оно будет скомпилировано.

Кроме того, поскольку ForEach() возвращает void, вам придется отбросить его на странице как блок кода. Таким образом, ваш код будет выглядеть примерно так:

@{
    Model.ToList().ForEach(i =>
    {
        if (i.DealerName != null) 
        {
            Response.Write(i.DealerName);
        }
    });
}

UPD: Если у вас есть более серьезное форматирование, вы можете прибегнуть к этому приятному маленькому трюку:
(к сожалению, краска кода здесь не даст этому фрагменту никакого кредита, но вы определенно увидите, что я имею в виду, если вы отбросите это в visual studio. Примечание: это будет работать только на страницах Razor, а не на кодовых файлах:))

@{
    Model.ToList().ForEach(i =>
    {
        if (i.DealerName != null) 
        {
            Response.Write(((Func<dynamic, object>)(
                @<text>
                    <b>Hello Dealer named: @item.DealerName
                    Multiline support is <em>Beautiful!</em>
                </text>)).Invoke(i));
        }
    });
}

Надеюсь, что это имеет смысл:)

Ответ 2

В качестве альтернативы вы можете создать лямбда-функцию и вызвать это для каждого элемента в теле вашего кода Razor (идея пришла от Andy в этом сообщении):

@model IEnumerable<Dealer>

@{
    Func<Dealer, object> sayHi = 
        @<text>
             <b>Hello Dealer named: @(item.DealerName)</b>
             Multiline support is <em>Beautiful!</em>
         </text>;
}

<div>
    @foreach(var dealer in Model.ToList())
    {
        sayHi(dealer);
    }
</div>

Ответ 3

Да, они поддерживаются. НО, у Razor есть некоторые странные правила экранирования, и дополнительные фигурные скобки заставят его задушить иногда, в том числе в расширенных выражениях лямбда.

Вы можете упростить @Artioms немного ответить, чтобы удалить лишние фигурные скобки, где и, возможно, предложение select

@{
    Model.ToList().ForEach(i =>
    {
        if (i.DealerName != null) 
        {
            Response.Write(i.DealerName);
        }
    });
}

становится

@{
    Model.Where(i=>i.DealerName != null).ToList().ForEach(i =>
    {
            Response.Write(i.DealerName);
    });
}

Также может стать

@{Model.Where(i=>i.DealerName != null).Select(i=>i.DealerName)
    .ToList().ForEach(Response.Write);}

Функциональные стили Yay!