Использование лямбда-выражения в ASP.NET MVC View с использованием VB.NET

С ASP.NET MVC 1.0, .NET 3.5 и C# вы можете легко передать методу лямбда-выражение, которое будет выполнять "Response.Write" некоторый контент, когда он выполняется внутри метода:

<% Html.SomeExtensionMethod(
    () => { <%
        <p>Some page content<p>
    %> }
) %>

Подпись метода похожа на это:

public void SomeExtensionMethod(this HtmlHelper helper, Action pageContent)
{
    pageContent();
}

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

Я пробовал следующее в VB.NET, но это не будет работать:

<% Html.SomeExtensionMethod(New Action( _
    Function() %> <p>Some Content</p> <% _
    )) %>

Я получаю исключение, говорящее "Выражение ожидается".

Может кто-нибудь помочь мне с тем, что я делаю неправильно? Как вы делаете это в VB.NET?

1 ответ

Решение

VB.NET 9.0 не поддерживает лямбда-выражения с несколькими операторами или анонимные методы. Он также не поддерживает лямбда-выражения, которые не возвращают значение, означающее, что вы не можете объявить анонимную функцию типа Action.

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

<% Html.SomeExtensionMethod(New Action(Function() "<p>Some Content</p>"))%>

Теперь давайте возьмем ваш пример:

<% Html.SomeExtensionMethod(New Action( _
    Function() %> <p>Some Content</p> <% _
)) %>

Должно быть переведено что-то вроде этого:

Html.SomeExtensionMethod(New Action(Function() Html.ViewContext.HttpContext.Response.Write("<p>Some Content</p>")))

который не компилируется в VB.NET 9.0, потому что ваше выражение не возвращает значение.

В VB.NET 10 вы сможете использовать ключевое слово Sub:

Html.SomeExtensionMethod(New Action(Sub() Html.ViewContext.HttpContext.Response.Write("<p>Some Content</p>")))

который будет компилироваться нормально.

Другие вопросы по тегам