将“Html.RenderPartial()”嵌套到另一个“@if”中的正确方法是什么?剃刀

时间:2016-02-04 16:58:02

标签: c# razor

我继承了一个MVC网站,由于缩进变坏,一些MVC视图无法读取。
如果我使用"CTRL K + D"来格式化整个文档,它会将左括号的括号括起来,以及代码块,然后一些HTML就在左边,然后是另一个方向的C#。 /> 我创建了一个简单的示例页面来演示它:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Example Page</title>
</head>
<body>
    @if (IsSectionDefined("page"))
    {
        @RenderSection("page")
    }
    else
    {
        var test = "Hello";
        <nav>
            @if (true) // Some unimportant statement
            {
                <div>
                    @{ test = "Hi"; }
                    @test
                </div>
                        } @* <-- THIS is the start of the issue. It should be in-line with the start "@if...{" *@
                    </nav>

                        if (IsSectionDefined("Main")) // <-- This whole section is again far to far to the right
                        {
                            @RenderSection("Main")
                        }

                        @RenderBody() // <-- As is this
                        } @* This is the closing bracket for the "else {" just inside the body and should only be indented once! *@

                        @{ Html.Zone("Scripts").Render(); }
                    </body>
                </html>

正如你在第20行所看到的,一切都出错了。那个支架是向右边的。然后“”就可以了,但是进一步的C#再次向右移动,包括围绕它的“if else”的结束“}”。

我已经确定它似乎是由嵌套代码块引起的(如果外部块是“@if(){}”或只是“@{}”则无关紧要。我在其中添加了另一个“@{}”代码块(其中包含一些HTML标记,如示例中的“<div>”(不需要额外的“@if(){}”块,但显示了问题更好))格式错误之后的所有C#/ Razor代码。

我已经确定,如果我将代码块“@{}”转换为if块“@if(true){}”(具有始终为真值),那么格式化会修复它的自我,所有这些都很好但是结果输出是相同的(如果编译时间,那么额外的吧?)!例如,这里是与上面相同的代码块,代码块替换为始终为true的块:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Example Page</title>
</head>
<body>
    @if (IsSectionDefined("page"))
    {
        @RenderSection("page")
    }
    else
    {
        var test = "Hello";
        <nav>
            @if (true) // Some unimportant statement
            {
                <div>
                    @if (true) { test = "Hi"; }
                    @test
                </div>
            } @* <-- THIS is the start of the issue. It should be in-line with the start "@if...{" *@
        </nav>

        if (IsSectionDefined("Main")) // <-- This whole section is again far to far to the right
        {
            @RenderSection("Main")
        }

        @RenderBody() // <-- As is this
    } @* This is the closing bracket for the "else {" just inside the body and should only be indented once! *@

    @{ Html.Zone("Scripts").Render(); }
</body>
</html>

我看过所有可以找到的文档和ScottGu的博客都有很多信息(特别是这个页面:http://weblogs.asp.net/scottgu/asp-net-mvc-3-implicit-and-explicit-code-nuggets-with-razor)但是它没有告诉我这段代码有什么问题以及正确的做法它没有像我已经解决过的“@if(true){}"那样的人。

有没有人知道原因。这是一个已知的错误(请引用参考文献)或有更好的方法来做到这一点。 :)

由于

1 个答案:

答案 0 :(得分:1)

尝试使用Html.Partial而不是Html.RenderPartial。这应该使它不会变得混乱,因为不再有代码块。

@if(true)
{
  <div>
    @Html.Partial("LayoutOne")
  </div>
}

您也可以尝试将包含RenderPartial的括号放在不同的行上,但无论如何,此代码应该使用Partial