2013-11-15 3 views
1

Я хочу вернуть ViewBag на мою главную страницу, но у меня нет большого опыта работы с MVC Razor, поэтому я не знаю, как решить свою проблему, вот мой код:Обратный просмотрBag на главную страницу MVC Razor

Контроллеры:

MasterController.cs

public class SharedController : Controller 
{ 
    public ActionResult SiteMaster() 
    { 
     ViewBag.PageTitle = "Show this text into my MasterPage"; 
     return View(); 
    } 
} 

и

HomeController.cs

public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
     return View(); 
     } 
    } 

Просмотров:

Общие ->SiteMaster.cshtml

<html> 
<head></head> 
<body> 
<div>@ViewBag.PageTitle</div> //Doesn't work 
<div>@RenderBody()</div> 
</body> 
</html> 

Главная ->Index.cshtml

@{ 
    Layout = "~/Views/Shared/SiteMaster.cshtml"; 
} 
<div>Test</div> 

App_Start ->RouteConfig.cs

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

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
+0

Вы хотите, чтобы 'ViewBag.PageTitle' каждый раз, когда вы показываете представление? –

+0

Да, потому что у меня есть главная страница, мне нужно, чтобы 'View Bag' отображался на каждой странице, содержащей« главную страницу ». – ToTa

ответ

0

Я считаю, что вам просто нужно поместить свое предложение в свое индексное действие вашего homecontroller. Действие вашего sitemaster не вызывается.

+0

Я только что пробовал это, но это не сработает, но мне нужно, чтобы viewbag отображался только на макете главной страницы и был отделен от других страниц. – ToTa

+0

Образцы имеют код для перезаписывания элементов суммирования в Иногда файлы cshtml - возможно, проверьте, что он не перезагружается каким-то образом в вашей бритве? –

+0

Что происходит, когда вы помещаете назначение представления в действие индекса и пытаетесь отобразить его в своем index.cshtml - это делает его, по крайней мере, так далеко? FYI. Я пробовал то, что вы описываете в новом проекте, и работает отлично (то есть с назначением в действии INDEX). –

1

Вы можете сделать это с помощью глобальной ActionFilter:

public class MasterPageTitleFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     filterContext.Controller.ViewBag.PageTitle = "Show this text into my MasterPage"; 
     base.OnActionExecuted(filterContext); 
    } 
} 

Если установить этот фильтр к действию, это вызовет, когда он заканчивается, перед генерацией вида, чтобы добавить свой титул в ViewBag ,

Для того, чтобы использовать его для каждого действия/контроллера без тегов всех из них, добавить к вашей глобальной регистрации фильтров:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    // other filters to add 
    filters.Add(new MasterPageTitleFilterAttribute()); 
} 
0

Вы можете сделать это создать базовый контроллер, который включает все перекрытый метод

public class BaseController: Controller 
{ 
    public override void OnActionExecuting(ActionExecutedContext filterContext) 
     { 
      filterContext.Controller.ViewBag.PageTitle = "Show this text into my MasterPage"; 
      //base.OnActionExecuted(filterContext); 
     } 
} 

тогда вы наследуете другие контроллеры от BaseController. В результате вы достигнете ViewBag.PageTitle каждый раз, когда в Masterpage ..

public class HomeController : BaseController 
{ 
... 
} 
+0

Ошибка «Belina.Controllers.BaseController.OnActionExecuted (System.Web.Mvc.ActionExecutedContext)»: не может изменять модификаторы доступа при переопределении «защищенного» наследуемого элемента «System.Web.Mvc.Controller.OnActionExecuted (System.Web. Mvc.ActionExecutedContext) ' – ToTa

+0

ОК, вы правы, я попробовал, я пропустил что-то, что я отредактировал, а не OnAction Выполнено, это должно быть OnActionExecuting, это работает. – AOZ

-1

Вы должны присвоить viewbag в действиях.

public class HomeController : Controller 
{ 
     public ActionResult Index() 
     { 
     ViewBag.PageTitle = "Show this text into my MasterPage"; 
     return View(); 
     } 
} 
Смежные вопросы