4

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

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

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

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

4

3 回答 3

2

这实际上很容易做到。

*global.asax - 内部 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放在扩展名之前。

于 2013-06-13T20:49:44.177 回答
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(因此是WebPages2.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)
        });
     }
于 2013-06-13T20:19:48.820 回答
0

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

于 2013-06-13T17:23:00.563 回答