_Layout.cshtml无法直接请求,因为它调用" RenderBody"方法

时间:2017-06-03 03:09:20

标签: c# asp.net-mvc asp.net-mvc-4 model-view-controller asp.net-mvc-5

我使用属性进行路由。这是相关的,我不知道。

当我不使用" Route"属性,共享控制器中的_Layaout()动作不起作用,但页面正在渲染。

public class SharedController : Controller
    {
        // GET: Shared
        [AllowAnonymous]
        public ActionResult _Layout()
        {

            return View();
        }
    }

当我使用" Route"属性它确实有效但我得到以下错误:

public class SharedController : Controller
{
    // GET: Shared
    [AllowAnonymous]
    [Route]
    public ActionResult _Layout()
    {

        return View();
    }
}
  

文件"〜/ Views / Shared / _Layout.cshtml"不能直接要求   因为它调用" RenderBody"方法

也是global.asax

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/",                           // URL with parameters
                new { controller = "Home", action = "Index" }  // Parameter defaults
            );
        }

编辑:

_Layout.cshtml

 @model OgrenciEvi.Models.ViewModel

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>@ViewBag.Title - Ogrencievi.net</title>
        <link href="~/Content/Site.css" rel="stylesheet" type="text/css" />
        <link href="~/Content/bootstrap.min.css" rel="stylesheet" type="text/css" />
        <link href="~/Content/font-awesome.min.css" rel="stylesheet" />
        <link href="~/Content/tether.css" rel="stylesheet" type="text/css" />

        <link rel="icon" type="image/png" href="~/Image/favicon.ico" />

        <script src="@Url.Content("~/Scripts/jquery-3.0.0.min.js")"></script>
        <script src="@Url.Content("~/Scripts/tether.js")"></script>
        <script src="@Url.Content("~/Scripts/bootstrap.min.js")"></script>
        <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
        <script src="http://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
    </head>
    <body class="p-0">

        @Html.Partial("Navbar")
        <div class="container-fluid p-0">
            @RenderBody()

        </div>
        @Html.Partial("_LoginModal",Model)
        @Html.Partial("_GoogleAnalyticTracker")

    </body>
</html>

Index.cshtml:

@model OgrenciEvi.Models.ViewModel

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "Ana Sayfa";
}

@Html.Partial("LandingSection/SearchSection", Model)

_ViewStart.cshtml:

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

Path Image

1 个答案:

答案 0 :(得分:1)

_Layout.cshtml(更正确地说,任何包含.cshtml方法的@RenderBody()文件)被MVC框架视为母版页(也就是布局视图) - 这是一个使用的页面作为渲染其他页面的模板。因此无法直接请求。

引用布局视图的正确方法是在将使用它的任何视图中设置布局属性。例如:假设您有一个名为Index.cshtml的视图;在其中,您将放置以下行:

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

如果您希望布局视图应用于项目中的所有视图,则您需要在文件中添加上述代码段:~/Views/_ViewStart.cshtml

完成上述所有操作后,修改您的控制器,以便没有视图指向布局页面。这可以通过确保没有操作方法命名为_Layout,或者在操作中调用View()方法时传递感兴趣视图的名称来完成。