在我的一个MVC项目中,我为测试部署站点设置了特殊的配置。这样做,我能够添加配置转换以覆盖我的web.config文件中的各种设置。例如,我有以下文件:
web.config
web.release.config
web.debug.config
web.testsite.config
当我部署到我的测试网站时,它现在会覆盖我的web.testsite.config中指定的一些设置
是否有可能在我的某些观看中获得相同的行为?例如,我可以拥有Index.testsite.cshtml吗?我可以使用配置中的标志来打开和关闭行为,但是看起来更简洁的方法是允许基于配置的其他转换/替换视图。
答案 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)
您可以实现一个自定义操作过滤器,用于检查配置设置并根据其值提供正确的视图。