MVC视图可以转换为多个部署,如web.config文件可以吗?

时间:2013-06-13 16:02:00

标签: asp.net-mvc asp.net-mvc-3

在我的一个MVC项目中,我为测试部署站点设置了特殊的配置。这样做,我能够添加配置转换以覆盖我的web.config文件中的各种设置。例如,我有以下文件:

web.config
web.release.config
web.debug.config
web.testsite.config

当我部署到我的测试网站时,它现在会覆盖我的web.testsite.config中指定的一些设置

是否有可能在我的某些观看中获得相同的行为?例如,我可以拥有Index.testsite.cshtml吗?我可以使用配置中的标志来打开和关闭行为,但是看起来更简洁的方法是允许基于配置的其他转换/替换视图。

3 个答案:

答案 0 :(得分:2)

这实际上很容易做到。

* global.asax - Inside Application_Start()*

var displayModes = DisplayModeProvider.Instance.Modes;
displayModes.Insert(0, new DefaultDisplayMode("TestSite")
    {
        ContextCondition = (context => IsTestSite())
    });

IsTestSite的定义()

public bool IsTestSite()
{
    bool isTestSite;
    return bool.TryParse(ConfigurationManager.AppSettings["isTestSite"], out isTestSite);
}

就是这样,现在您的应用会使用Intex.TestSite.cshtml,否则会提供Index.cshtml。对于任何其他视图名称也是如此,只需在扩展名之前粘贴TestSite

答案 1 :(得分:1)

添加到您的Base/Controller

protected override void OnResultExecuting(ResultExecutingContext filterContext)
{
    var viewResult = filterContext.Result as ViewResult;

    if (viewResult != null)
    {
        string env = ... // determine your environment somehow

        var razorEngine = viewResult.ViewEngineCollection.OfType<RazorViewEngine>().Single();
        var viewName = !String.IsNullOrEmpty(viewResult.ViewName) ? viewResult.ViewName : filterContext.RouteData.Values["action"].ToString();
        var razorView = razorEngine.FindView(filterContext.Controller.ControllerContext, viewName, viewResult.MasterName, false).View as RazorView;
        var currentPath = razorView.ViewPath;
        var newPath = currentPath.Replace(".cshtml", env + ".cshtml");

        if (razorEngine.FileExists(filterContext.Controller.ControllerContext, newPath))
            viewResult.View = new RazorView(filterContext.Controller.ControllerContext, newPath, razorView.LayoutPath, razorView.RunViewStartPages, razorView.ViewStartFileExtensions);
    }

    base.OnResultExecuting(filterContext);
}

此外,如果您使用MVC 4(因此WebPages 2.0),您可以使用DisplayModeProvider轻松实现此目的。

Global.asax

protected void Application_Start()
    {
        DisplayModeProvider.Instance.Modes.Add(new DefaultDisplayMode("debug")
        {
            ContextCondition = (context => context.IsDebuggingEnabled)
        });

        DisplayModeProvider.Instance.Modes.Add(new DefaultDisplayMode("test")
        {
            ContextCondition = (context => context.Request.IsLocal)
        });
     }

答案 2 :(得分:0)

您可以实现一个自定义操作过滤器,用于检查配置设置并根据其值提供正确的视图。