2012-04-19 55 views
4

相关:MVC3 Razor using Html.BeginForm problem为什么@Using Html.BeginForm中的普通标记需要@?

当我做一个HTML表单的MVC 3/VB剃刀引擎,我希望能够做到这一点是这样的:

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

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

回答

3

当使用剃刀用C#,你描述什么是可能的,因为解析器能够确定从代码由于标记的过渡HTML中明确的'<'字符不是有效的C#标记。 VB.NET直接在代码中支持内联XML,因此Razor解析器无法确定您已经转换回标记,因此您必须更加明确。

3

相信在剃刀beginform应该是这样的,即用花括号:

@using (Html.BeginForm()) 
{ 
    @* Other code here *@ 
} 
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的VB.NET上VS2010的快速行程,这就够了:

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

VB .NET的语言文字的XML支持相抵触运行Razor的解析器,只是阻止它添加额外的@@:

+0

什么额外的@或@:在那个代码中做?这是一种逃避角色吗? – 2012-04-19 15:35:55

+0

或多或少是的。它表示您正在逃避编程语言(例如C#,VB.NET)语法的剃刀。 C#不需要额外的微调,因为符号'<'没有被它使用,所以Razor也可以使用'''作为* C#的* *。在VB.NET中没有这样的特权,在VB.NET中,任何以'<开头的东西都是XML文字,所以对于这种情况,您需要使用Razor的@来避免VB.NET的语法 – 2012-04-19 15:46:28

+0

剃刀细微差别的例子:http://www.ienablemuch.com/2011/08/razor-tag-nuances.html – 2012-04-19 15:52:29

1

对于多线支撑,如Using in Razor VB.net MVC not work as expected指出的那样,你可以使用@<text>...</text>切换回“文本模式”和输出HTML这样的:

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