asp.net-mvc – 将MvcSiteMapProvider与属性和属性路由一起使用
我试图在我的ASP.Net MVC 5应用程序中使用MVCSiteMapProvider.可以找到大量资源和教程,但大多数都是基于
XML的配置.
在我的应用程序属性路由已经使用,我想使用MvcSiteMapProvider与属性但没有足够的资源有关此混合,我有一些问题. 例如,我有三个动作,如下所示: //HomeController [Route(@"~/home",Name = "CustomerHomeIndex")] [MvcSiteMapNode(Title = "Home Page",Key = "Home")] public ActionResult Index() { return View() } //AccountController [Route(@"~/account",Name = "AccountIndex")] [MvcSiteMapNode(Title = "Accounts",ParentKey = "Home",Key = "AccountIndex")] public ActionResult Index() { // fetching records from database return View(); } [Route(@"~/account-management/{id:int}/{domain:regex(^([w-]+.)+[w-]+(/[w-./?%&=]*)?$)}",Name = "AccountDetail")] [MvcSiteMapNode(Title = "Account Detail",ParentKey = "AccountIndex",Key = "AccountDetail")] public ActionResult Details(string domain,int id) { // fetching record from database by parameters return View(); } 我还在我的视图中添加了SiteMapPath代码 //Details.cshtml @Html.MvcSiteMap().SiteMapPath() 但结果并没有显示出任何结果.在我看来,它是关于保留路由参数,但我找不到任何关于MvcSiteMapNode属性中使用属性路由的参数. 其实我有另外一个关于本地化的问题,我想从资源文件中获取标题,一切都已存在于全局资源文件中.我读了一些关于本地化支持的内容,但它们也与基于XML的配置有关. 解决方法
默认情况下,启用XML和.NET属性的提供程序.在此配置中,必须将根节点(没有父键的节点)放在XML文件中.要在XML中没有任何配置的情况下独占使用.NET属性,您需要从配置中删除XML节点提供程序.
内部DI: <appSettings> <add key="MvcSiteMapProvider_EnableSiteMapFile" value="false"/> </appSettings> 外部DI(显示StructureMap示例): // Register the sitemap node providers var siteMapNodeProvider = this.For<ISiteMapNodeProvider>().Use<CompositeSiteMapNodeProvider>() .EnumerableOf<ISiteMapNodeProvider>().Contains(x => { //Remove the XmlSiteMapNodeProvider //x.Type<XmlSiteMapNodeProvider>() // .Ctor<bool>("includeRootNode").Is(true) // .Ctor<bool>("useNestedDynamicNodeRecursion").Is(false) // .Ctor<IXmlSource>().Is(xmlSource); x.Type<ReflectionSiteMapNodeProvider>() .Ctor<IEnumerable<string>>("includeAssemblies").Is(includeAssembliesForScan) .Ctor<IEnumerable<string>>("excludeAssemblies").Is(new string[0]); }); 您还需要确保包含控制器的程序集包含在IncludeAssembliesForScan配置设置中.请注意,NuGet包自动包含您安装MvcSiteMapProvider的程序集,因此如果您的控制器都在您的主MVC项目中,则无需触摸它. 内部DI: <appSettings> <add key="MvcSiteMapProvider_IncludeAssembliesForScan" value="MyAssembly,MyOtherAssembly"/> </appSettings> 外部DI: string[] includeAssembliesForScan = new string[] { "MyAssembly","MyOtherAssembly" }; ... Other code omitted ... // Register the sitemap node providers var siteMapNodeProvider = this.For<ISiteMapNodeProvider>().Use<CompositeSiteMapNodeProvider>() .EnumerableOf<ISiteMapNodeProvider>().Contains(x => { //Remove the XmlSiteMapNodeProvider //x.Type<XmlSiteMapNodeProvider>() // .Ctor<bool>("includeRootNode").Is(true) // .Ctor<bool>("useNestedDynamicNodeRecursion").Is(false) // .Ctor<IXmlSource>().Is(xmlSource); x.Type<ReflectionSiteMapNodeProvider>() .Ctor<IEnumerable<string>>("includeAssemblies").Is(includeAssembliesForScan) // <- Setting is injected here .Ctor<IEnumerable<string>>("excludeAssemblies").Is(new string[0]); }); 没有什么特别的,你需要做的是使它与AttributeRouting一起工作 – MvcSiteMapProvider会自动选择那些路由,只要你正确配置它们并在MVC中工作它应该可以工作. 是的,您可能需要将PreservedRouteParameters用于包含自定义参数的操作,如此. [Route(@"~/account-management/{id:int}/{domain:regex(^([w-]+.)+[w-]+(/[w-./?%&=]*)?$)}",Name = "AccountDetail")] [MvcSiteMapNode(Title = "Account Detail",Key = "AccountDetail",PreservedRouteParameters="domain,id")] public ActionResult Details(string domain,int id) { // fetching record from database by parameters return View(); } 在您的简单示例中,这将正常工作.但是,在将节点级别嵌套到第一个节点之外时,您需要完全了解savedRouteParameters如何正确使用它们.您不能使用具有相同键名的参数,这些参数具有在同一请求中可见的不同含义,因为MvcSiteMapProvider始终将当前请求中的值插入到具有匹配键名的所有节点中.您还必须在(子节点的)请求中提供祖先节点所需的任何密钥,以便导航工作.有关完整详细信息,请参阅How to Make MvcSiteMapProvider Remember a User’s Position和演示代码. 请参阅reading localization from an external assembly.但是,请注意,从v4.6.15开始,唯一可行的方法是使用外部DI容器注入自定义IStringLocalizer. 默认本地化实现只能支持放入App_GlobalResources文件夹的文件.请注意,这是problematic with MVC,因为添加这些文件时的默认设置使它们以无法从MVC访问的方式进行编译.我们目前是gathering requirements to make a new extension point,允许从备用位置配置资源. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – PreRenderComplete和SaveState之间的时间差
- asp.net-mvc-3 – 增加ASP.NET MVC 3中的超时值
- asp.net – 多重约束违反.关系“…”的角色“…”具有多重性
- entity-framework – 自定义IdentityUserRole主键
- asp.net-mvc – 配置Magical Unicorn Mvc错误工具包
- asp.net-mvc – 自定义验证属性不在客户端上工作,只在服务器
- 如何防止我的asp.net网站被屏幕刮掉?
- asp.net – 当请求具有查询字符串时,Web服务的缓存不起作用
- asp.net-mvc – 如何修复System.Net.Sockets.SocketExcepti
- asp.net-mvc – 属性似乎根本不起作用
- asp.net – 运行时MVC更新FormsAuthenticationTi
- asp.net – 如何让Html.RenderAction在帖子上调用
- ASP.Net负载均衡
- asp.net-mvc-3 – 如何在Razor中为Nullable创建编
- odata – 与Breezejs发布批量请求
- SimpleModal打破ASP.Net回传
- asp.net-mvc-3 – “区域”文件夹中的样式,脚本和
- iis-7 – Rotativa PDF生成本地工作,但不在IIS 7
- asp.net – system.web.compilation.debug与syst
- asp.net – 从命令行更改web.config