_Layout.cshtml не может быть запрошен напрямую, потому что он вызывает метод "RenderBody"
Я использовал атрибут для маршрутизации. Это актуально, я не знаю.
Когда я не использую атрибут "Маршрут", действие _Layaout() в совместно используемом контроллере не работает, но страница отображается.
public class SharedController : Controller
{
// GET: Shared
[AllowAnonymous]
public ActionResult _Layout()
{
return View();
}
}
Когда я использую атрибут "Маршрут", он работает, но я получаю следующую ошибку:
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";
}
1 ответ
_Layout.cshtml
(правильнее говоря, любой .cshtml
файл, который содержит @RenderBody()
method) обрабатывается платформой MVC как главная страница (также известная как макет) - это страница, используемая в качестве шаблона для визуализации других страниц. Таким образом, он не может быть запрошен напрямую.
Правильный способ ссылки на представление макета - установить свойство макета из любого представления, которое будет его использовать. Например: предположим, у вас есть представление под названием Index.cshtml
; внутри него вы поместите следующую строку:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
Однако, если вы хотите, чтобы представление макета применялось ко всем представлениям в вашем проекте, вам нужно добавить приведенный выше фрагмент кода в файл: ~/Views/_ViewStart.cshtml
После того, как вы проделали все вышеперечисленное, вы должны изменить свой контроллер, чтобы никакие представления не указывали на страницу макета. Это можно сделать, либо убедившись, что метод действия не назван _Layout
или вы передаете имя заинтересовавшего вас при вызове View()
метод внутри вашего действия.