为什么@Using Html.BeginForm中的正常标记需要@?

时间:2012-04-19 09:39:05

标签: asp.net-mvc vb.net asp.net-mvc-3 razor

相关:MVC3 Razor using Html.BeginForm problem

当我使用Razor引擎制作MVC 3 / VB的HTML表单时,我希望能够这样做:

@Using Html.BeginForm("Action", "Controller")
    <fieldset>
        @* Other form code and values *@
    </fieldset>
End Using

但是,如果我这样做,我得到“BC32035:属性说明符不是一个完整的语句。使用行继续将属性应用于以下语句。”我需要在开始标记之前添加@字符以避免此错误。有人可以解释原因吗?

4 个答案:

答案 0 :(得分:3)

我相信Razor beginform应该是这样的,即用花括号:

@using (Html.BeginForm())
{
    @* Other code here *@
}

答案 1 :(得分:3)

我不使用VB.NET,但我认为你应该这样做:

@Using Html.BeginForm("Action", "Controller")
    @:<fieldset>
        @* Other form code and values *@
    @:</fieldset>
End Using

借助VB.NET对XML的一流支持,它将标记视为XML,因此它也将字段集(任何HTML标记)视为XML;和XML作为VB.NET语言的一部分,它将与Razor的解析器

背道而驰

使用ASP.NET MVC for VB.NET快速浏览VS2010,这就足够了:

@Using Html.BeginForm("Action", "Controller")
    @<fieldset>
        @* Other form code and values *@
    </fieldset>
End Using

VB.NET的语言文字XML支持与Razor的解析器发生冲突,只是通过添加额外的@@:

来阻止它

答案 2 :(得分:3)

当使用Razor和C#时,你所描述的是可能的,因为解析器可以确定从代码到标记的转换,因为显式的'&lt;' html中的字符不是有效的C#标记。 VB.NET直接在代码中支持内联XML,因此Razor解析器无法确定您是否已转换回标记,因此您必须更加明确。

答案 3 :(得分:1)

对于多行支持,如Using in Razor VB.net MVC not work as expected所述,您可以使用@<text>...</text>切换回&#34;文字模式&#34;并输出这样的HTML:

@Using Html.BeginForm("Action", "Controller")
    @<text>
      <fieldset>
        * Other form code and values *
      </fieldset>
    </text>
End Using