Erik Philips
Erik Philips

Reputation: 54618

Setting the layout in Controller

In Previous versions of MVC I was able to set the layout in the controller using the View() method.

public class MyController
{
  public ActionResult Test1()
  {
    return View("Test", "Layout1");
  }
  public ActionResult Test2()
  {
    return View("Test", "Layout2");
  }
}

However it appears that in the documentation there is no overload for View that takes the Layout/Template/Masterpage as a parameter.

Adding logic to all my models or views is really a terrible option for this logic, so is there an alternative in the controller method?

Asp.Net MVC 6/Core Controller Source Code.

Upvotes: 4

Views: 2043

Answers (1)

Erik Philips
Erik Philips

Reputation: 54618

It feels dirty, but I did:

No magic strings (Theory):

public enum ViewDataType
{
    Layout = 0
}

ViewData Extensions

public static class ViewDataExtensions
{
    public static void Add(this ViewDataDictionary viewData, ViewDataType viewDataType, object value)
    {
        viewData.Add(viewDataType.ToString(), value);
    }

    public static TResult Get<TResult>(this ViewDataDictionary viewData, ViewDataType viewDataType)
        where TResult : class
    {
        var result = viewData[viewData.ToString()] as TResult;

        return result;
    }
}

Controller Extensions:

public static class ControllerExtensions
{
    public static IActionResult View(this Controller instance, object model, string layout)
    {
        instance.ViewData.Add(ViewDataType.Layout, layout);
        return instance.View(model);
    }

    public static IActionResult View(this Controller instance, string viewName, object model, string layout)
    {
        instance.ViewData.Add(ViewDataType.Layout, layout);
        return instance.View(viewName, model);
    }
}

Usage:

public IActionResult Index()
{
  // blah blah logic

  var result = this.View("ViewName", model, "Layouts/Default");
}

and in the ViewStart:

var layout = this.ViewData.Get<string>(ViewDataType.Layout)
if (string.IsNullOrEmpty(layout))
{
    Layout = "Layouts/Default";
}
else
{
    Layout = layout;
}

Upvotes: 1

Related Questions