Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC视图是否可以转换为web.config文件等多个部署?_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc MVC视图是否可以转换为web.config文件等多个部署?

Asp.net mvc MVC视图是否可以转换为web.config文件等多个部署?,asp.net-mvc,asp.net-mvc-3,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吗?我可以通过配

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

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


在我的一些观点上是否可能得到相同的行为?例如,我可以拥有Index.testsite.cshtml吗?我可以通过配置中的标志开关行为,然而,一种更干净的方法似乎是允许基于配置的其他转换/替换视图。

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

添加到
基本/控制器中

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);
}

这其实很容易做到

*global.asax-内部应用程序_Start()*

IsTestSite()的定义


就是这样,现在你的应用程序将使用
Intex.TestSite.cshtml
如果存在,否则它将提供
Index.cshtml
。任何其他视图名称也是如此,只需在扩展之前粘贴
TestSite

如何
Index.TestSite.cshtml
覆盖
Index.cshtml
中的一些代码?基于什么语法(不涉及xml转换)?或者你只是想让MVC在
test
环境中使用
Index.testsite.cshtml
?是的,我认为使用此功能将完全取代MVC。因此,如果我使用“testsite”配置发布构建,它会知道使用Index.cshtmlI的testsite版本,但我更好奇的是,是否已经有一些功能或最佳实践来实现这一点。把它放在代码里似乎过了一段时间就会变得一团糟。我希望找到一种更有条理/更容易发现的方法。我无法让你的第二种方法正确工作,但它在Yarx的例子中起了作用+我赞成这个主意!没问题,它的目的是允许您使用基于浏览器功能的其他显示模式,比如手机或平板电脑的显示模式,或者如果您需要的话,更具体地说,IE或Safari的显示模式。但我发现它同样适用于显示基于开发环境的备用视图或其他特定于上下文的数据。例如,公共用户可能会获得与员工不同的视图。我不知道这个方法的安全性是什么样的,但这只是表示层。无论如何,所有服务器端代码都应该有冗余的安全检查。
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)
        });
     }
var displayModes = DisplayModeProvider.Instance.Modes;
displayModes.Insert(0, new DefaultDisplayMode("TestSite")
    {
        ContextCondition = (context => IsTestSite())
    });
public bool IsTestSite()
{
    bool isTestSite;
    return bool.TryParse(ConfigurationManager.AppSettings["isTestSite"], out isTestSite);
}