无法使用DynamicNode为MvcSiteMapProvider定义外部URL

时间:2013-04-22 23:05:18

标签: url mvcsitemapprovider

我几个小时以来一直在思考这个问题,在我看来,虽然XML站点地图功能已更新为接受带有URL属性的外部URL,但该功能并未通过DynamicNode扩展到动态定义。

我们有几个共享菜单的应用程序,因此我们需要对这些菜单项进行单一定义,每个菜单项都指向Intranet中的一个应用程序。我们目前使用(用于ASP.NET)自定义站点地图,需要将XML文件部署到每个应用程序,我希望MVC实现动态地读取项目 - 可能来自数据库。

由于DynamicNode没有URL属性,因此它明确要求路径是虚拟的并且基于其他属性(控制器,操作,路由)。我尝试实现UrlResolver来查看“HTTP”的“动作”,这有效,并且我返回了URL不变。但是,我收到了可怕的

  

http://site.com/App不是有效的虚拟路径。”

错误。似乎作者在3.1.0中为XML属性引入的更改未转换为动态等效项。谁能帮我?这是我编写的用于扩展默认类的代码。此代码执行并正常工作。在ResolveUrl返回我的HTTP之后的某个时候,失败发生了,所以我想我要么丢失了某些东西,要么就是无法完成。

   public class DynamicSiteMapNodeProvider : DynamicNodeProviderBase
    {
        override public IEnumerable<DynamicNode> GetDynamicNodeCollection()
        {
            var nodes = new List<DynamicNode>();
            nodes.Add(new DynamicNode
                {
                    Key = "Dynamic1",
                    Title = "Dynamic One!",
                    Action = "http://my.site.com/MyApp"

                });
            return nodes;

        }
    }

    public class FlexibleSiteMapUrlResolver: DefaultSiteMapNodeUrlResolver
    {
        public override string ResolveUrl(MvcSiteMapNode mvcSiteMapNode, string area, string controller, string action, IDictionary<string, object> routeValues)
        {
            // when action value is clearly a web site url, simply accept it.
            if (action.Substring(0, 5).ToLower() == "http:")
            {
                return action;
            }
            return base.ResolveUrl(mvcSiteMapNode, area, controller, action, routeValues);
        }
    }

2013年5月15日:有没有人可以帮忙解决这个问题?

1 个答案:

答案 0 :(得分:0)

这已在版本4中修复 - URL属性已添加到DynamicNode对象,其工作方式与其他任何位置相同。

第4版于几周前发布,可在NuGet上找到。