ASP.NET MVC - Установите Master View соответственно с контроллером - PullRequest
5 голосов
/ 13 сентября 2009

Случайно, есть ли простой способ установить MasterView по умолчанию для всех действий внутри определенного контроллера?

Например, если у меня есть HomeController , я хочу, чтобы все действия внутри него наследовали Site.Master по умолчанию, но если я нахожусь внутри AccountsController Я хочу, чтобы все действия наследовали Admin.Master и т. Д.

Мне удалось сделать это с:

return View("viewName", "masterName", objectModel);

Но, делая это, я должен применять его каждый раз, когда вызываю метод View.

Я искал что-то более простое, например, на рельсах, где мы можем объявить:

class HomeController < ApplicationController

  layout 'site'

   def index
   end

   def create
   ...

end

class AccountsController < ApplicationController

  layout 'admin'

  def index
  end

  def create
  ...  

end

Возможно ли это?

Заранее спасибо

1 Ответ

6 голосов
/ 13 сентября 2009

Вы можете переопределить OnActionExecuting в этом классе Controller.

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    ViewData["MasterfileToUser"] = "site";
}       

Или, если хотите, можете превратить это в атрибут ActionFilterAttribute, который можно применить к контроллеру или уровню действия

using System;
using System.Web.Mvc;
public class MasterFileFilterAttribute : ActionFilterAttribute
{
    public string Master { get; set; }

    public override void OnActionExecuted( ActionExecutedContext filterContext)   
    {        
            if (filterContext.Result is ViewResult)
                    ((ViewResult)filterContext.Result).MasterName = Master;
    }
}

, который вы затем, в свою очередь, используете так:

[MasterFileFilterAttribute(Master = "site")] 
public class HomeController : Controller 
{ 
    // Action methods 
}   
...