asp.net mvc - Macken der Razor View Engine in VB.NET

Translate

Ich habe gerade die MVC 3.0 RC heruntergeladen und freue mich darauf, sie zu verwenden, insbesondere die Razor View Engine. Aufgrund einiger Leute, die hier im Schlamm stecken bleiben, verwenden wir jedoch VB.NET anstelle von C #.

Als ich anfing, es auszuprobieren, bemerkte ich einige Macken. Wenn Sie eine Rasiermesseransicht mit CSHTML erstellen, können Sie Code wie folgt schreiben:

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

Razor erkennt automatisch, dass die<li>Text ist ein HTML-Tag und wechselt aus dem "Codemodus". Bei einer VB.NET VBHTML-Datei scheint dies nicht zu funktionieren. Es bringt mich dazu, das zu sagen@:Schlüsselwort vor jeder Zeile wie folgt:

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

Wenn ich es dort nicht habe, erhalte ich einen Laufzeitfehler. Auch der<text></text>Tags scheinen nicht zu funktionieren.

Weiß jemand, was hier los ist oder ob es eine Problemumgehung gibt?

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Ich würde sagen, der Grund, warum es in Vb.net erforderlich ist, ist, dass vb XML-Elemente inline zulässt, während c # dies nicht tut.

Dim xmlMarkup = <someElement>Values</span>

Aus diesem Grund muss sich der natürliche Parser für vb anders verhalten als c #, sodass Sie den Parser anweisen müssen, mithilfe von@. Sie können verwenden@und@:.

Quelle
Translate

Wie zuvor in Kommentaren erwähnt, aber nicht explizit gezeigt; Wenn Sie dem Text-Tag @ voranstellen, wird das Problem behoben:

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

Ich habe dies gerade in ASP.NET MVC 3 RC in einer VBHTML-Ansicht versucht und es scheint gut zu funktionieren:

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

Es rendert dieses Markup:

<ul>
    <li>0</li>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
</ul>
Quelle
Translate

Dies verwendet nicht den gleichen Code wie das OP, aber ich konvertierte etwas C # -Code aus einem MVC-Buch in VB.NET und blieb beim Mischen von Inline-HTML- und VB-Code hängen. Dies ist das Original 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>
}

und dies sind die verschiedenen Arten, es in VB darzustellen:

@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

Daraus sollte ersichtlich sein, dass Sie, wenn Sie Inline-HTML in einen Codeblock aufnehmen müssen, jeder Zeile entweder ein Präfix voranstellen müssen@:oder schließen Sie den HTML-Code mit einem@<text></text>Block. Es ist auch offensichtlich, dass dies gilt, wenn Sie verwenden@Code...End Codeanstatt einen Codeblock mit zu starten@.

ps Beachten Sie, dass die@<text></text>Tags werden nicht auf der Seite ausgegeben, sodass sie nichts stören

Quelle
Translate

AKTUALISIEREN:

Sie können @ li @ genreName / li ohne das: verwenden, da sich Ihre HTML-Tags selbst schließen. Wenn dies nicht der Fall wäre, müssten Sie @: verwenden. Dies ist jedoch nicht der Fall, der in dem von Gabe bereitgestellten Link erläutert wird. Ebenfalls,@<text>wird auch funktionieren! Ich würde es hassen, wenn die Leute denken würden, sie müssten @: die ganze Zeit verwenden, weil sie es nicht tun, wenn dies der Fall wäre, wäre ich wegen dieses Hardcore auf Andrew Nurse :) END UPDATE

Hier ist die grundlegende Syntax für vb razor:

Das @ -Zeichen startet Inline-Ausdrücke, Blöcke mit einer Anweisung und Blöcke mit mehreren Anweisungen:

?
<!-- 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>

Es sollte also funktionieren, schließen Sie einfach den Codemodus am Ende von für jede Zeile und Ihren Rücken in HTML. Dies würde vermeiden, dass Sie die @: - Jagd nach Ellon verwenden. Ich denke, er versucht, nicht @: verwenden zu müssen.

Quelle
Leave a Reply
You must be logged in to post a answer.
Über den Autor