我已将应用程序启动事件中的显示模式设置为
DisplayModeProvider.Instance.Modes.Insert( 0, new DefaultDisplayMode( "iPhone" ){
ContextCondition = ( context =>
context.GetOverriddenUserAgent( ).IndexOf(
"iPhone",
StringComparison.OrdinalIgnoreCase ) >= 0 ) } );
然后在控制器中我返回View我在哪里指定视图名称:
返回视图(“〜/ Views / Common / User / Login.cshtml”,viewModel);
如果我从iPhone访问该页面,它将直接进入登录视图
如果我没有指定视图名称:
return View( viewModel );
在这种情况下,从iPhone我看到Login.iPhone.cshtml
问题:是否可以指定视图的名称,但是DisplayModeProvider如何选择cshtml文件的常规或iPhone版本?
答案 0 :(得分:0)
我通常不喜欢复活旧问题,但由于这个问题从未得到解答,而且这是我在寻找自己答案方面遇到特别困难的问题,对于遇到同样问题的其他人来说,可能值得给出答案。
您可以将其他位置添加到您正在使用的ViewEngine的ViewLocationFormats和PartialViewLocationFormats集合中。这样你就可以像tvanfosson建议的那样指定视图名称,MVC会正确地找到文件,这应该允许移动覆盖工作它的神奇。
以下是我用来覆盖PartialViewLocationFormats的一些代码,您也可以使用ViewLocationFormats执行相同的操作。这是作为application_start
的一部分添加到global.asax中的 ViewEngines.Engines.Clear();
var razorViewEngine = new RazorViewEngine
{
PartialViewLocationFormats = new[]
{
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.cshtml",
"~/Views/{1}/EditorTemplates/{0}.cshtml",
"~/Views/{1}/DisplayTemplates/{0}.cshtml",
"~/Views/Shared/DisplayTemplates/{0}.cshtml"
}
};
由于此方法涉及清除viewengines集合,因此您需要为所有正在使用的视图引擎添加所有locationFormats,甚至是标准格式。