使用 File.Exists() 检查磁盘上是否存在视图



我想构建一种方法来覆盖运行时 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视图。如果不存在,它将回退到常规视图。

最新更新