代码之家  ›  专栏  ›  技术社区  ›  Jakub Å turc

如何在ASP.NET中更改默认视图位置方案。网络MVC?

  •  36
  • Jakub Å turc  · 技术社区  · 17 年前

    基本上,我想知道如何实现 WebFormViewEngine custom IDescriptorFilter 在 Spark .


    {lang}/{controller}/{action}/{id}

    5 回复  |  直到 15 年前
        1
  •  33
  •   Duncan Smart    12 年前

    Appication_Start ViewEngine ViewEngines.Engines 收集并更新其 ViewLocationFormats PartialViewLocationFormats 无需技巧:默认情况下是读/写的。

    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
    }
    

    looks like this

    ViewLocationFormats = new string[]
    {
        "~/Views/{1}/{0}.cshtml",
        "~/Views/{1}/{0}.vbhtml",
        "~/Views/Shared/{0}.cshtml",
        "~/Views/Shared/{0}.vbhtml"
    };
    

    备注 您可能想要更新 局部视图位置格式 也。

        2
  •  9
  •   Luiso Rahul    10 年前

    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 == '/');
            }
    
        }
    }
    
        3
  •  3
  •   Dan Atkinson    15 年前

    1) 从剃刀视图引擎扩展类

    public class LocalizationWebFormViewEngine : RazorViewEngine

    public LocalizationWebFormViewEngine() 
    {
        base.PartialViewLocationFormats = new string[] {
            "~/Views/{2}/{1}/{0}.cshtml", 
            "~/Views/{2}/{1}/{0}.aspx", 
            "~/Views/{2}/Shared/{0}.cshtml", 
            "~/Views/{2}/Shared/{0}.aspx"
        };
    
        base.ViewLocationFormats = new string[] {
            "~/Views/{2}/{1}/{0}.cshtml", 
            "~/Views/{2}/{1}/{0}.aspx", 
            "~/Views/{2}/Shared/{0}.cshtml", 
            "~/Views/{2}/Shared/{0}.aspx"
        };
    }
    

    public override ViewEngineResult FindPartialView(ControllerContext controllerContext, String partialViewName, Boolean useCache)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }
        if (String.IsNullOrEmpty(partialViewName))
        {
            throw new ArgumentException("partialViewName");
        }
    
        string[] partialViewLocationsSearched;
    
        string controllerName = controllerContext.RouteData.GetRequiredString("controller");
        string partialPath = GetPath(controllerContext, PartialViewLocationFormats, "PartialViewLocationFormats", partialViewName, controllerName, _cacheKeyPrefix_Partial, useCache, out partialViewLocationsSearched);
    
        return new ViewEngineResult(CreatePartialView(controllerContext, partialPath), this);}
    }
    
        4
  •  1
  •   Arnis Lapsa    17 年前

    public class ViewEngine : WebFormViewEngine
    {
        public ViewEngine()
        {
            if (CultureIsX())
                ViewLocationFormats = new string[]{"route1/controller.aspx"};
            if (CultureIsY())
                ViewLocationFormats = new string[]{"route2/controller.aspx"};
        }
    }
    

    ViewEngines.Engines.Add(new ViewEngine());
    
        5
  •  1
  •   Omar    13 年前

    向上看一个视图。引擎将使用双字符语言来查找视图。如果当前语言是 es ~/Views/Home/Index.es.cshtml .

    public class LocalizedViewEngine : RazorViewEngine
    {
        private string[] _defaultViewLocationFormats;
    
        public LocalizedViewEngine()
            : base()
        {
            // Store the default locations which will be used to append
            // the localized view locations based on the thread Culture
            _defaultViewLocationFormats = base.ViewLocationFormats;
        }
    
        public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
        {
            AppendLocalizedLocations();
            return base.FindPartialView(controllerContext, partialViewName, useCache:fase);
        }
    
        public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        {
            AppendLocalizedLocations();
            returnbase.FindView(controllerContext, viewName, masterName, useCache:false);
        }
    
        private void AppendLocalizedLocations()
        {
            // Use language two letter name to identify the localized view
            string lang = Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName;
    
            // Localized views will be in the format "{action}.{lang}.cshtml"
            string localizedExtension = string.Format(".{0}.cshtml", lang);
    
            // Create an entry for views and layouts using localized extension
            string view =  "~/Views/{1}/{0}.cshtml".Replace(".cshtml", localizedExtension);
            string shared =  "~/Views/{1}/Shared/{0}".Replace(".cshtml", localizedExtension);
    
            // Create a copy of the default view locations to modify
            var list = _defaultViewLocationFormats.ToList();
    
            // Insert the new locations at the top of the list of locations
            // so they're used before non-localized views.
            list.Insert(0, shared);
            list.Insert(0, view);
            base.ViewLocationFormats = list.ToArray();
        }
    }
    
    推荐文章