Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p><code>VirtualPathProviderViewEngine.GetPathFromGeneralName</code> must be changed to allow an additional parameter from the route. Its not public, that's why you have to copy <code>GetPath</code>, <code>GetPathFromGeneralName</code>, <code>IsSpecificPath</code> ...over to your own <code>ViewEngine</code> implementation.</p> <p>You are right: this looks like a complete rewrite. I wished <code>GetPathFromGeneralName</code> was public. </p> <pre><code>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) &amp;&amp; !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 &lt; 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 == '/'); } } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload