Jak*_*urc 32 .net asp.net-mvc viewengine
我想根据当前的UI文化在运行时更改视图位置.如何使用默认Web窗体视图引擎实现此目的?
基本上我想知道如何与实现WebFormViewEngine
的东西是什么风俗IDescriptorFilter的星火.
是否有其他视图引擎可以让我对视图位置进行运行时控制?
编辑:我的网址应该如下{lang}/{controller}/{action}/{id}
.我不需要语言相关的控制器和视图本地化的资源.但是,在某些语言中,很少有观点会有所不同.所以我需要告诉视图引擎首先查看特定于语言的文件夹.
Dun*_*art 34
一个简单的解决方案是,在你从集合中Appication_Start
获取适当ViewEngine
的ViewEngines.Engines
并更新其ViewLocationFormats
数组和PartialViewLocationFormats
.没有hackery:它默认是读/写.
protected void Application_Start()
{
...
// Allow looking up views in ~/Features/ directory
var razorEngine = ViewEngines.Engines.OfType<RazorViewEngine>().First();
razorEngine.ViewLocationFormats = razorEngine.ViewLocationFormats.Concat(new string[]
{
"~/Features/{1}/{0}.cshtml"
}).ToArray();
...
// also: razorEngine.PartialViewLocationFormats if required
}
Run Code Online (Sandbox Code Playgroud)
Razor的默认值如下所示:
ViewLocationFormats = new string[]
{
"~/Views/{1}/{0}.cshtml",
"~/Views/{1}/{0}.vbhtml",
"~/Views/Shared/{0}.cshtml",
"~/Views/Shared/{0}.vbhtml"
};
Run Code Online (Sandbox Code Playgroud)
请注意,您可能还想要更新PartialViewLocationFormats
.
VirtualPathProviderViewEngine.GetPathFromGeneralName
必须更改以允许路线中的其他参数.它不是公开的,这就是为什么你必须复制GetPath
,GetPathFromGeneralName
,IsSpecificPath
...在你自己ViewEngine
的实现.
你是对的:这看起来像一个完全重写.我希望GetPathFromGeneralName
是公开的.
using System.Web.Mvc;
using System;
using System.Web.Hosting;
using System.Globalization;
using System.Linq;
namespace MvcLocalization
{
public class LocalizationWebFormViewEngine : WebFormViewEngine
{
private const string _cacheKeyFormat = ":ViewCacheEntry:{0}:{1}:{2}:{3}:";
private const string _cacheKeyPrefix_Master = "Master";
private const string _cacheKeyPrefix_Partial = "Partial";
private const string _cacheKeyPrefix_View = "View";
private static readonly string[] _emptyLocations = new string[0];
public LocalizationWebFormViewEngine()
{
base.ViewLocationFormats = new string[] {
"~/Views/{1}/{2}/{0}.aspx",
"~/Views/{1}/{2}/{0}.ascx",
"~/Views/Shared/{2}/{0}.aspx",
"~/Views/Shared/{2}/{0}.ascx" ,
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Views/Shared/{0}.aspx",
"~/Views/Shared/{0}.ascx"
};
}
private VirtualPathProvider _vpp;
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
if (controllerContext == null)
throw new ArgumentNullException("controllerContext");
if (String.IsNullOrEmpty(viewName))
throw new ArgumentException( "viewName");
string[] viewLocationsSearched;
string[] masterLocationsSearched;
string controllerName = controllerContext.RouteData.GetRequiredString("controller");
string viewPath = GetPath(controllerContext, ViewLocationFormats, "ViewLocationFormats", viewName, controllerName, _cacheKeyPrefix_View, useCache, out viewLocationsSearched);
string masterPath = GetPath(controllerContext, MasterLocationFormats, "MasterLocationFormats", masterName, controllerName, _cacheKeyPrefix_Master, useCache, out masterLocationsSearched);
if (String.IsNullOrEmpty(viewPath) || (String.IsNullOrEmpty(masterPath) && !String.IsNullOrEmpty(masterName)))
{
return new ViewEngineResult(viewLocationsSearched.Union(masterLocationsSearched));
}
return new ViewEngineResult(CreateView(controllerContext, viewPath, masterPath), this);
}
private string GetPath(ControllerContext controllerContext, string[] locations, string locationsPropertyName, string name, string controllerName, string cacheKeyPrefix, bool useCache, out string[] searchedLocations)
{
searchedLocations = _emptyLocations;
if (String.IsNullOrEmpty(name))
return String.Empty;
if (locations == null || locations.Length == 0)
throw new InvalidOperationException();
bool nameRepresentsPath = IsSpecificPath(name);
string cacheKey = CreateCacheKey(cacheKeyPrefix, name, (nameRepresentsPath) ? String.Empty : controllerName);
if (useCache)
{
string result = ViewLocationCache.GetViewLocation(controllerContext.HttpContext, cacheKey);
if (result != null)
{
return result;
}
}
return (nameRepresentsPath) ?
GetPathFromSpecificName(controllerContext, name, cacheKey, ref searchedLocations) :
GetPathFromGeneralName(controllerContext, locations, name, controllerName, cacheKey, ref searchedLocations);
}
private string GetPathFromGeneralName(ControllerContext controllerContext, string[] locations, string name, string controllerName, string cacheKey, ref string[] searchedLocations)
{
string result = String.Empty;
searchedLocations = new string[locations.Length];
string language = controllerContext.RouteData.Values["lang"].ToString();
for (int i = 0; i < locations.Length; i++)
{
string virtualPath = String.Format(CultureInfo.InvariantCulture, locations[i], name, controllerName,language);
if (FileExists(controllerContext, virtualPath))
{
searchedLocations = _emptyLocations;
result = virtualPath;
ViewLocationCache.InsertViewLocation(controllerContext.HttpContext, cacheKey, result);
break;
}
searchedLocations[i] = virtualPath;
}
return result;
}
private string CreateCacheKey(string prefix, string name, string controllerName)
{
return String.Format(CultureInfo.InvariantCulture, _cacheKeyFormat,
GetType().AssemblyQualifiedName, prefix, name, controllerName);
}
private string GetPathFromSpecificName(ControllerContext controllerContext, string name, string cacheKey, ref string[] searchedLocations)
{
string result = name;
if (!FileExists(controllerContext, name))
{
result = String.Empty;
searchedLocations = new[] { name };
}
ViewLocationCache.InsertViewLocation(controllerContext.HttpContext, cacheKey, result);
return result;
}
private static bool IsSpecificPath(string name)
{
char c = name[0];
return (c == '~' || c == '/');
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23032 次 |
最近记录: |