VB.NET中的Razor View引擎怪癖

时间:2010-11-12 21:46:16

标签: asp.net-mvc vb.net visual-studio-2010 razor

我刚刚下载了MVC 3.0 RC,我很高兴开始使用它,尤其是Razor视图引擎。然而,由于在这里的泥类型中有一些人,我们坚持使用VB.NET而不是C#。

当我开始尝试时,我注意到了一些怪癖。如果您使用CSHTML创建Razor视图,则可以编写如下代码:

@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 个答案:

答案 0 :(得分:16)

我想说在Vb.net中需要的原因是vb允许xml元素内联,而c#不允许。

Dim xmlMarkup = <someElement>Values</span>

因此,vb的自然解析器的行为必须与c#不同,因此您必须使用@告诉解析器转义回html。您可以使用@@:

答案 1 :(得分:4)

如前所述,但未明确显示;在文本标签前加@解决问题:

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

答案 2 :(得分:2)

我刚刚在VBHTML视图中尝试了ASP.NET MVC 3 RC,它似乎工作正常:

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

答案 3 :(得分:1)

这并没有使用与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

从中可以明显看出,当您需要在代码块中包含内联HTML时,您需要为每行添加@:前缀,或者将HTML括在@<text></text>块中。当您使用@Code ... End Code而不是使用@启动代码块时,这也很明显。

P.S。请注意,@<text></text>标记不会输出到页面,因此不会干扰任何内容

答案 4 :(得分:0)

更新:

你可以使用@ li @ genreName / li而不使用:因为你的HTML标签是自动关闭的,如果不是那么你需要使用@:但是你没有,这在Gabe提供的链接中有所阐明。此外,@<text>也可以使用!我讨厌人们认为他们需要使用@:所有的时间因为他们不这样做,如果是这样的话,我会去安德鲁护士关于这个铁杆:) END UPDATE

以下是vb razor的基本语法,

@字符启动内联表达式,单语句块和多语句块:

?
<!-- 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中,这将避免你使用@: - 搜索到ellon,我认为他试图不必使用@ :