我想在运行时构建一种覆盖ASP.NET MVC视图的方法。基本的想法是拥有 MyView.cshtml 和可选的 MyView.Override.cshtml 。只要 MyView.Override.cshtml 出现在磁盘上,就应该使用它而不是原始视图。
我想做的是:
protected new ActionResult View(string viewName)
{
var overridePath = viewName.Replace(".cshtml", ".Override.cshtml"); // i.e. ~/Views/MyView.Override.cshtml
if (System.IO.File.Exists(Server.MapPath(overridePath)))
{
return base.View(overridePath); // use override
}
return base.View(viewName); // use default
}
这基本上有效。我的问题:在解析视图时使用 File.Exists()是不错的做法?这会引入任何问题(灵活性,性能)吗?我是否缺少标准的MVC方式来做同样的事情?
答案 0 :(得分:1)
如果您希望在应用程序中的每个页面都有这种可能性,那么已经有一种方法可以执行此操作,称为DisplayModeProvider。这种情况的典型用例是具有移动或浏览器特定的视图。
例如,您可以设置Index.Mobile.cshtml,如果内置提供程序确定请求的浏览器是基于用户代理字符串的移动设备,则它将返回该视图而不是Index.cshtml。
但是,您可以create your own提供商添加其他因任何原因而返回的内容。
在Startup或Global.asax(取决于OWIN等)中,您需要添加以下代码:
DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("Override")
{
// Make it always try this
ContextCondition = (ctx => true)
});
在代码中使用它,它将始终尝试返回xxxx.Override.cshtml视图。如果不存在,它将回退到常规视图。