You can still do something very similar to your original approach, using ViewData
to pass around the layout name (Although I would create it as a Result Filter):
public class ViewLayoutAttribute : ResultFilterAttribute
{
private string layout;
public ViewLayoutAttribute(string layout)
{
this.layout = layout;
}
public override void OnResultExecuting(ResultExecutingContext context)
{
var viewResult = context.Result as ViewResult;
if (viewResult != null)
{
viewResult.ViewData["Layout"] = this.layout;
}
}
}
Then in the _ViewStart.cshtml
file:
@{
Layout = (string)ViewData["Layout"] ?? "_Layout";
}
Finally, assuming you create a new layout like Views/Shared/_CleanLayout.cshtml
, you can use that attribute on any controller or action:
[ViewLayout("_CleanLayout")]
public IActionResult About()
{
//...
}