Asp.Net Mvc - Как иметь "контроллер" в общем виде
У меня есть общий вид в моем _Layout.cshtml для моего заголовка с именем "_Header.cshtml".
Я хотел бы отображать текст и изображение из базы данных, поэтому мне нужно, чтобы мой контроллер заходил в базу данных и возвращал его в _Header.cshtml.
Как я могу это сделать, потому что вызываемый контроллер всегда отличается от каждой страницы, на которую идет пользователь. Есть ли способ иметь контроллер с общим представлением?
Вот _Layout.cshtml
<div id="header">
<div id="title">
@Html.Partial("_Header")
</div>
<div id="logindisplay">
@Html.Partial("_CultureChooser")
<br />
@Html.Partial("_LogOnPartial")
</div>
<div id="menucontainer">
@Html.Partial( "_MenuPartial")
</div>
</div>
<div id="main">
@RenderBody()
<div id="footer">
</div>
</div>
</div>
Ответы
Ответ 1
В вашем действии contoller вы можете указать имя представления:
public class MenuController : Controller
{
[ChildActionOnly]
public ActionResult Header()
{
var model = ... // go to the database and fetch a model
return View("~/Views/Shared/_Header.cshtml", model);
}
}
Теперь в _Layout.cshtml
вместо @Html.Partial("_Header")
сделайте следующее:
@Html.Action("Header", "Menu")
Ответ 2
... 1 год спустя просто хотел бы добавить к Димитрову ответ. Вы можете сделать контроллер немного чище:
public class MenuController : Controller
{
[ChildActionOnly]
public ActionResult Header()
{
var model = ... // go to the database and fetch a model
return Partial("_Header", model);
}
}
Ответ 3
Создайте действие в одном из ваших контроллеров, чтобы отобразить представление заголовка, а затем просто вызовите @Html.RenderAction( "Заголовок" ) в файле _Layout.cshtml.
При необходимости вы можете передать модель в метод RenderAction.
Ответ 4
В то время как подход RenderAction, который WDuffy предоставил, работает хорошо, я недавно написал блог об этой самой теме, используя другой подход, используя IoC:
http://crazorsharp.blogspot.com/2011/03/master-page-model-in-aspnet-mvc-3-using.html
Ответ 5
Я надеюсь, что вопрос, который вы задали, как....
Можем ли мы иметь контроллер для представления общего макета.
Простой ответ: Нет.
Для достижения этой цели вам необходимо создать частичное представление для этой же цели и поместить его в общий макет. Таким образом, вы можете достичь цели.