Причуды Razor View Engine в VB.NET - PullRequest
22 голосов
/ 13 ноября 2010

Я только что скачал MVC 3.0 RC, и я рад начать использовать его, особенно движок Razor View. Однако, из-за того, что здесь есть несколько людей, использующих грязь, мы застряли с использованием VB.NET вместо C #.

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

@foreach(string genreName in Model.Genres)
{
    <li>@genreName</li>
}

Razor автоматически обнаружит, что текст <li> является HTML-тегом, и переключится из «режима кода». С файлом VB.NET VBHTML это, похоже, не работает. Это заставляет меня помещать ключевое слово @: перед каждой строкой так:

@For Each genreName As String In Model.Genres
    @:<li>@genreName</li>
Next

Если у меня его там нет, я получаю ошибку во время выполнения. Кроме того, теги <text></text> не работают.

Кто-нибудь знает, что здесь происходит или есть обходной путь?

Ответы [ 5 ]

16 голосов
/ 13 ноября 2010

Я бы сказал, что причина, по которой это требуется в Vb.net, заключается в том, что vb допускает встроенные элементы xml, а c # - нет.

Dim xmlMarkup = <someElement>Values</span>

Из-за этого естественный синтаксический анализатор для vb должен вести себя не так, как c #, поэтому вы должны указать синтаксическому анализатору вернуться к html, используя @. Вы можете использовать @ и @:.

4 голосов
/ 07 сентября 2012

Как уже упоминалось в комментариях, но явно не показано;добавление @ к текстовому тегу решает проблему:

@For Each genreName As String In Model.Genres
    @<text>
        <li>@genreName</li>
    </text>
Next
2 голосов
/ 13 ноября 2010

Я только что попробовал это в ASP.NET MVC 3 RC в представлении VBHTML, и это, кажется, работает нормально:

<ul>
@For Each i As Integer In Enumerable.Range(0, 5)
    @:<li>@i</li>
Next
</ul>

Это отображает эту разметку:

<ul>
    <li>0</li>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
</ul>
1 голос
/ 14 октября 2014

Это не использует тот же код, что и OP, но я конвертировал некоторый код C # из книги MVC в VB.NET и застрял в смешивании встроенного кода HTML и VB.Это оригинальный C #:

@using (Html.BeginForm()) {
    @Html.ValidationSummary()
        <p>Your name: @Html.TextBoxFor(x => x.Name, new { @class = "form-control" }) </p>
        <p>Your email: @Html.TextBoxFor(x => x.Email, new { @class = "form-control" }) </p>
        <p>Your phone: @Html.TextBoxFor(x => x.Phone, new { @class = "form-control" }) </p>
        <p>Will you attend?
        @Html.DropDownListFor(x => x.WillAttend, new[] {
                new SelectListItem() {Text = "Yes, I'll be there",
                    Value = bool.TrueString},
                new SelectListItem() {Text = "No, I can't come",
                    Value = bool.FalseString}
            }, "Choose an option", new { @class = "form-control" })
        </p>
}

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

@Using Html.BeginForm()
    @:<p>Your name: @Html.TextBoxFor(Function(x) x.Name)</p>
    @:<p>Your email: @Html.TextBoxFor(Function(x) x.Email)</p>
    @:<p>Your phone: @Html.TextBoxFor(Function(x) x.Phone)</p>
    @:<p>Will you attend?
    @Html.DropDownListFor(Function(x) x.WillAttend, New SelectListItem() {New SelectListItem() With {.Text = "Yes", .Value = Boolean.TrueString}, New SelectListItem() With {.Text = "No", .Value = Boolean.FalseString}})
    @:</p>
End Using

@Using Html.BeginForm()
    @<text>
        <p>Your name: @Html.TextBoxFor(Function(x) x.Name)</p>
        <p>Your email: @Html.TextBoxFor(Function(x) x.Email)</p>
        <p>Your phone: @Html.TextBoxFor(Function(x) x.Phone)</p>
        <p>Will you attend?
        @Html.DropDownListFor(Function(x) x.WillAttend, New SelectListItem() {New SelectListItem() With {.Text = "Yes", .Value = Boolean.TrueString}, New SelectListItem() With {.Text = "No", .Value = Boolean.FalseString}})
        </p>
    </text>
End Using

@code
    Using Html.BeginForm()
        @:<p>Your name: @Html.TextBoxFor(Function(x) x.Name)</p>
        @:<p>Your email: @Html.TextBoxFor(Function(x) x.Email)</p>
        @:<p>Your phone: @Html.TextBoxFor(Function(x) x.Phone)</p>
        @:<p>Will you attend?
        @Html.DropDownListFor(Function(x) x.WillAttend, New SelectListItem() {New SelectListItem() With {.Text = "Yes", .Value = Boolean.TrueString}, New SelectListItem() With {.Text = "No", .Value = Boolean.FalseString}})
        @:</p>
    End Using
End Code

@code    
    Using Html.BeginForm()
        @<text>
            <p>Your name: @Html.TextBoxFor(Function(x) x.Name)</p>
            <p>Your email: @Html.TextBoxFor(Function(x) x.Email)</p>
            <p>Your phone: @Html.TextBoxFor(Function(x) x.Phone)</p>
            <p>Will you attend?
            @Html.DropDownListFor(Function(x) x.WillAttend, New SelectListItem() {New SelectListItem() With {.Text = "Yes", .Value = Boolean.TrueString}, New SelectListItem() With {.Text = "No", .Value = Boolean.FalseString}})
            </p>
        </text>
    End Using
End Code

. Из этого следует, что когда вам нужно включить inlineHTML в кодовом блоке вам нужно либо поставить перед каждой строкой @:, либо заключить HTML в блок @<text></text>.Также очевидно, что это применимо, когда вы используете @Code ... End Code вместо запуска блока кода с @.

ps. Обратите внимание, что теги @<text></text> не выводятся встраницы, чтобы они не мешали чему-либо

0 голосов
/ 13 ноября 2010

ОБНОВЛЕНИЕ:

Вы можете использовать @ li @ genreName / li без: потому что ваши HTML-теги являются самозакрывающимися, если они не были, вам нужно будет использовать @: но вы этого не делаете, этоуточняется в ссылке, предоставленной Гейбом.Также @<text> тоже будет работать!Я не хотел бы, чтобы люди думали, что им нужно использовать @: все время, потому что они этого не делают, если бы это было так, я бы обратился к медсестре Эндрю по поводу этого хардкора :) КОНЕЦ ОБНОВЛЕНИЯ

Вотбазовый синтаксис для бритвы vb,

Символ @ запускает встроенные выражения, блоки с одним оператором и блоки с несколькими операторами:

?
<!-- Single statement blocks  -->

@Code  Dim total = 7  End Code

@Code  Dim myMessage = "Hello World" End Code

 
<!-- Inline expressions -->
<p>The value of your account is: @total </p>

<p>The value of myMessage is: @myMessage</p>

        
     
<!-- Multi-statement block -->

@Code

    Dim greeting = "Welcome to our site!"

    Dim weekDay = DateTime.Now.DayOfWeek

    Dim greetingMessage = greeting & " Today is: " & weekDay.ToString()

End Code

<p>The greeting is: @greetingMessage</p>

Так что это должно работать, просто закройте режим кода вконец каждой строки и ваша спина в HTML, это позволит избежать использования @: - охоты на Эллона, я думаю, он пытается не использовать @:

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