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

Razor View Engine Quirks в VB.NET

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

Когда я начал проверять это, я заметил некоторые причуды. Если вы создаете представление 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>, похоже, не работают.

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

4b9b3361

Ответ 1

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

Dim xmlMarkup = <someElement>Values</span>

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

Ответ 2

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

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

Ответ 3

Я просто попробовал это в 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>

Ответ 4

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

@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

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

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

Ответ 5

UPDATE:

Вы можете использовать @li @genreName/li без: потому что ваши HTML-теги автоматически закрываются, если они не были тогда, вам нужно будет использовать @: но вы этого не сделаете, это разъясняется в ссылке, предоставленной Гейбом, Также, @<text> также будет работать! Я бы не хотел, чтобы люди думали, что им нужно использовать @: все время, потому что они этого не делают, если бы это было так, я бы нанял Эндрю медсестру об этом хардкоре:) END UPDATE

Вот основной синтаксис для 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, это позволит избежать использования @: - hunt to ellon, я думаю, что он пытается не использовать @