MVC的新手无法根据需要使布局工作

时间:2015-12-11 14:30:35

标签: c# asp.net-mvc razor

我正在尝试实施我认为非常标准的仪表板"布局。诀窍是我了解ASP.NET但不熟悉MVC所以这是一个学习项目。

我读了很多文章,他们帮助我进步到了我非常困难和困惑的地步。

我的一些困惑来自于我从用户角度熟悉的现有高级MVC项目。这有助于我能够选择源代码并将我正在学习的东西与我从用户角度看到的东西相匹配。

  

这不仅仅是一个例子......

例如,我在这里读到了我认为对概念的一个非常好的介绍。 (http://www.codeproject.com/Articles/383145/RenderBody-RenderPage-and-RenderSection-methods-in

在MVC项目中,我可以选择,但是我在_Layout

中看到了
@if (IsSectionDefined("statusbar"))
{
   @RenderSection("statusbar")
}

但_section状态栏未在_Layout中定义。如果我对@section进行全局搜索,我会发现:

@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
@section header
{
}
@section headermenu
{
}
@section statusbar
{
}
@RenderBody()

所以我猜测状态栏已定义但是它是一个空shell吗?

如果它是一个空shell,它是如何填充的......因为当项目运行时状态栏确实有信息???

所以,这不是我的问题,它只是一个例子,说明手边的信息让我感到困惑。

  

IS 问题:我不确定何时使用PartialView,RenderSection ......等

我的布局变得愚蠢。什么是高飞?我能想到的唯一一件事就是向你展示所发生的事情的截图。

Unexpected Behaviour

  

我想要的......

Good behaviour

以下是用于生成这些页面的代码。为简洁起见,省略了用于自举等的标签等。

  

_Layout.cshtml

<!DOCTYPE html>
<html lang="en">
<head>
    <title>@PageTitle</title>
</head>
<body>
    <div class="container-fluid">
        <div class="row">
            <div class="col-md-12">
                Header Stuff
            </div>
        </div>

        <div class="row">
            <div class="col-md-4">
                @RenderBody()
            </div>
            <div class="col-md-8">
                Main Content
            </div>
        </div>

        <div class="row">
            <div class="col-md-12">
                Footer Stuff
            </div>
        </div>
    </div>
</body>
</html>
  

Index.cshtml

@model DashboardModel
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}

<div class="col-md-1">
<nav id="Navbar" class="navbar navbar-left" role="navigation">
    <div id="organizer">
        @(Html.Kendo().PanelBar()....etc....)
    </div>
</nav>
</div>
<div class="col-md-3">
 This is a place holder for my subnav...????
</div>
  

Stuff1Link cshtml

@model StuffModel

<div style="height:400px; border:dashed; border-width:thick;">
@{ Html.Kendo().MobileLayout().Name("mlay_PropStatus"); }
@(Html.Kendo().MobileView().....
</div>

3 个答案:

答案 0 :(得分:1)

似乎布局没有放在Stuff1Link.cshtml

你能说得好吗,

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

答案 1 :(得分:1)

1 。如果您的观点只有一些Html代码,请使用“PartialView”:

@Html.Partial("_theLastPost")

2 。如果你的视图有控制器传递数据,最好使用“RenderAction”:

@{ Html.RenderAction("_theLastPost"); }

及其控制器

public PartialViewResult _theLastPost()
    {
        var a = (from c in db.Posts
                 orderby c.ID_Post descending
                 select c);
        return PartialView(a);
    }

3 。我不使用渲染部分。有关RenderSection的更多信息,请转到asp.net mvc layouts and sections with razor

答案 2 :(得分:0)

我有一个post on my blog,其中讨论了一些您可能想要查看的内容。

您引用的布局代码没有多大意义。实际上,宣布空白部分的唯一目的是满足它存在的要求,当你不想在那里实际传递任何东西时。由于布局是定义它是否必须存在的定义,因此它在那里存在是空的没有意义。更重要的是,如果您在基本布局中实现了一个部分,那么您将收到运行时错误,因为在视图链中没有更高的地方定义它。

长短,为您使用的部分在布局中提供占位符:

@RenderSection("SectionName", [true|false])

布尔参数指示使用此布局的视图是否必须实现该部分; false表示可选,true表示需要。

要在视图中实现某个部分,请使用:

@section SectionName
{
    ...
}

如果您的布局继承自另一个布局,那么该布局必须在其继承的布局中实现所有必需的部分。如果您希望该部分可用于使用子布局的视图,则必须重新定义实现部分中的部分:

<强> _Layout.cshtml

@RenderSection("Foo", true)

<强> _SubLayout.cshtml

@{ Layout = "Views\Shared\_Layout.cshtml"; }

@section Foo
{
    @RenderSection("Foo", true)
}

最后,对于部分视图与部分,这一切都取决于您是否要在布局或视图中插入内容。例如,部分最常用于在关闭body标记之前将head标记插入head或script标记中的CSS文件,其中视图本身将无法直接触摸。然而,它几乎是苹果和橘子的比较。部分可以在布局,视图或甚至部分中使用。然而,部分只能在布局中使用。