Question

By any chance, is there any easy way to set a default MasterView for all the actions inside a specific controller?

For example If I have the HomeController I want all the actions inside it to inherit the Site.Master as default, but If I am inside AccountsController I want all the action to inherit the Admin.Master and so on..

I managed to do it with:

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

But by doing this I have to apply it every time I call the View method.

I was looking for something simpler like on rails where we can declare:

class HomeController < ApplicationController

  layout 'site'

   def index
   end

   def create
   ...

end

class AccountsController < ApplicationController

  layout 'admin'

  def index
  end

  def create
  ...  

end

Is that possible?

Thanks in advance

Was it helpful?

Solution

You could override OnActionExecuting in that Controller class.

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

Or if you like you can turn this into an ActionFilterAttribute you can apply on the controller or action level

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;
    }
}

which you then in turn use like so:

[MasterFileFilterAttribute(Master = "site")] 
public class HomeController : Controller 
{ 
    // Action methods 
}   
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top