我想构建一种方法来覆盖运行时 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方法来做同样的事情?
如果您希望应用程序中的每个页面都有这种可能性,那么已经有一种方法可以做到这一点,称为 DisplayModeProvider。其典型用例是具有特定于移动或浏览器的视图。
例如,您可以设置 Index.Mobile.cshtml,如果内置提供程序根据用户代理字符串确定请求浏览器是移动设备,则内置提供程序将返回该视图而不是 Index.cshtml。
但是,您可以创建自己的提供程序来添加其他提供程序,这些提供程序将出于您希望的任何原因返回。
在您的 Startup 或 Global.asax 中(取决于 OWIN 等),您需要添加以下代码:
DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("Override")
{
// Make it always try this
ContextCondition = (ctx => true)
});
在你的代码中有了这个,它将始终尝试返回一个xxxx.Override.cshtml视图。如果不存在,它将回退到常规视图。