使用ASP时不识别大括号.. NET MVC Razor在VS2015中的应用

本文关键字:Razor MVC VS2015 应用 NET ASP 识别 使用 | 更新日期: 2023-09-27 18:18:27

我在VS2015的cshtml Razor视图中遇到了一个奇怪的问题。我认为这一定是一个剃刀的错误,但如果有一个完整的检查和解决方法的建议,我将感激不尽。

这个问题是@{}代码块中的花括号不能正确解析。我在foreach循环中有一个if语句,如果我使用花括号来包围if动作,我会得到一个编译错误。有趣的是,else语句后面的花括号看起来很好。

用VS的颜色编码来演示会更容易一些,但是这里。

如此:

@{
    var nestLevel = 0;
    foreach (var t in xmlHelper.GetProperties(asm, ViewBag.xmlType, "root"))
    {
        var type = @t.Item3.PropertyType;
        if (xmlHelper.builtInTypes.Contains(type.ToString()))
            <p>@t.Item1 @t.Item2 @t.Item3.PropertyType</p>
        else
        {
            nestLevel++;
        }
    }
} //VS shows the @{} code block ending here as expected

但是,如果我现在在if动作周围加上花括号,它将无法编译:

@{
    var nestLevel = 0;
    foreach (var t in xmlHelper.GetProperties(asm, ViewBag.xmlType, "root"))
    {
        var type = @t.Item3.PropertyType;
        if (xmlHelper.builtInTypes.Contains(type.ToString()))
        {
            <p>@t.Item1 @t.Item2 @t.Item3.PropertyType</p>
        }
        else
        {
            nestLevel++;
        }
    } //VS now incorrectly shows the @{} code block ending here 
} 

任何想法/建议吗?

使用ASP时不识别大括号.. NET MVC Razor在VS2015中的应用

删除这一行的@:

var type = @t.Item3.PropertyType;

你已经在一个c#代码区,所以你不需要@来引用变量,如果你在一个HTML区域。

可以在下一行这样做,因为当你以可识别的HTML开始一行时,它会假设切换回HTML,并跳出c#。这是一个HTML区域

<p>@t.Item1 @t.Item2 @t.Item3.PropertyType</p>

作为题外话,当我想强制使用HTML模式以便输出变量的值时,我经常使用这个快捷方式。

@if (t.isExample)
{
   @: @t.OutputThis
}

当你使用@令牌剃须刀视图,你告诉引擎停止解析html,并试图解释c#语言,剃须刀是够聪明,知道什么时候停止解析,因为令牌你要写是html语言的一部分,因此您需要指定此时剃须刀应该阅读你的c#代码,那你为什么在你的if语句需要再次打开识别@令牌。如果您想转义@令牌,因为您试图将@写成html,那么请使用@@代替@。希望对大家有所帮助