在以前版本的 MVC 中,我能够使用 View()
method 在 Controller 中设置布局。 .
public class MyController
{
public ActionResult Test1()
{
return View("Test", "Layout1");
}
public ActionResult Test2()
{
return View("Test", "Layout2");
}
}
然而,在 documentation 中似乎没有将 Layout/Template/Masterpage 作为参数的 View 重载。
将逻辑添加到我的所有模型或 View 对于这种逻辑来说确实是一个糟糕的选择,那么在 Controller 方法中是否有替代方法?
Asp.Net MVC 6/核心 Controller Source Code .
最佳答案
感觉很脏,但我做到了:
没有魔法弦(理论):
public enum ViewDataType
{
Layout = 0
}
查看数据扩展
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 扩展:
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);
}
}
用法:
public IActionResult Index()
{
// blah blah logic
var result = this.View("ViewName", model, "Layouts/Default");
}
在 ViewStart 中:
var layout = this.ViewData.Get<string>(ViewDataType.Layout)
if (string.IsNullOrEmpty(layout))
{
Layout = "Layouts/Default";
}
else
{
Layout = layout;
}
关于c# - 在 Controller 中设置布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37424614/