我刚刚下载了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>
代码似乎无效。
有人知道这里发生了什么或是否有解决方法?
答案 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,我认为他试图不必使用@ :