Карта сайта / Breadcrumb не отображаются с URL-маршрутизацией на странице по умолчанию - PullRequest
3 голосов
/ 12 ноября 2010

У меня есть настройка моего сайта веб-форм (4.0) с UrlRouting.Моя хлебная крошка появляется, когда я иду к

Моя главная проблема с http://Localhost/

Так как в IIS по умолчанию http://Localhost/default.aspx

Я пытаюсь избежать маршрута добавления другого элемента в карту сайта xml, например

<siteMapNode url="~/Home" title="Home"  description="Home" aspx="default.aspx">

Что будетлучший подход к использованию?

Я пытался добавить это в свою таблицу маршрутизации и использовать xmlSiteMapProvider, чтобы посмотреть, смогу ли я что-то с ним сделать (что не сработало).

routes.MapPageRoute("IISDefault", "", "~/Default.aspx");

Вот некоторая информация.

Routes
routes.MapPageRoute("Default", "Home", "~/Default.aspx");
routes.MapPageRoute("ListAll", "List", "~/ListAll.aspx");

Sitemap
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode url="~/Home" title="Home"  description="Home">
        <siteMapNode url="~/List" title="List All"  description="List All"  />
    </siteMapNode>
</siteMap>

XmlSiteMapProvider

   /// <summary>
    /// This is where the original sitemap node is overloaded.  We get the proper translation from the database.
    /// </summary>
    /// <param name="sender">This is the sender of the event</param>
    /// <param name="e">This is the event arguments</param>
    /// <returns>Returns a modified SiteMapNode</returns>
    /// <remarks></remarks>
    public SiteMapNode SmartSiteMapProvider_SiteMapResolve(object sender, SiteMapResolveEventArgs e)
    {

        SiteMapNode returnValue = null;

        if ((SiteMap.CurrentNode == null))
        {
            // If we don't find a sitemap node, then we might be working with UrlRouting
            returnValue = ProcessRoute(e);
        }


        return returnValue;

    }

    private SiteMapNode ProcessRoute(SiteMapResolveEventArgs e)
    {

        SiteMapNode returnValue = null;

        System.Web.Routing.RequestContext rc = HttpContext.Current.Request.RequestContext;

        if ((rc != null))
        {
            System.Web.Routing.RouteBase route = rc.RouteData.Route;

            if ((route != null))
            {
              // Play with the node (Never getting here)
            }
        }

        return returnValue;

    }

Edit: я собираюсь посмотреть, смогу ли я манипулировать routeCollection, чтобы каким-либо образом получить совпадение.

1 Ответ

2 голосов
/ 11 июля 2011

Вместо:

Routes
routes.MapPageRoute("Default", "Home", "~/Default.aspx");
routes.MapPageRoute("ListAll", "List", "~/ListAll.aspx");

Sitemap
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode url="~/Home" title="Home"  description="Home">
        <siteMapNode url="~/List" title="List All"  description="List All"  />
    </siteMapNode>
</siteMap>

попробуйте это:

Routes
routes.MapPageRoute("Default", "Home", "~/");
routes.MapPageRoute("ListAll", "List", "~/ListAll.aspx");

Sitemap
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode url="~/" title="Home"  description="Home">
        <siteMapNode url="~/List" title="List All"  description="List All"  />
    </siteMapNode>
</siteMap>

В противном случае «~ /» и «~ / Home» - это одно и то же.

или вы можете оставить вышеприведенное как есть и на странице default.aspx сделать что-то вроде этого ...

if(Page.RouteData.Values[0] == "default.aspx")
    Response.Redirect("~/Home")

Это будет эффективно перенаправлять любой запрос по умолчанию к вашему запросу по умолчанию.

Ваша проблема в том, что сервер видит ~ / "и" ~ / Home "как два разных URL, и вы в основном хотите, чтобы они были одинаковыми, поэтому вам нужно принять решение и решить, на какой из них перенаправитьдругой.

лично, если бы это было моим решением, у меня не было бы маршрута для "~ / Home", и мой базовый узел в моей карте сайта выглядел бы примерно так:

<siteMapNode url="~/" title="Home"  description="Home">

Очевидно, что «http://yourdomain/" - это домашняя страница, а» http://yourdomain/Home" может быть чем угодно (о вашем доме, моем доме, домашнем милом доме, вещах, которые мне нравятся в моем доме), тогда как «http://adomain/" - это домашняя страница по всему миру.для всех.

...