Reputation: 54618
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
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