2017-02-21 34 views
0

Как указано в заголовке, URL-адрес одного из узлов в пакете не соответствует правилу. Я просто получаю http://localhost/#URL-адрес узла MvcSiteMapProvider, отображаемый как/#

Очевидно, что у меня что-то не так. У меня есть другие, похожие структуры в файле Sitemap, которые работают. Можете ли вы сказать, что это пропало?

При необходимости я могу разместить дополнительную информацию.

SiteMap:

<mvcSiteMapNode title="ISP" controller="xxx" action="Index"> 
    <mvcSiteMapNode title="PC" action="Details" preservedRouteParameters="pcId"> 
    <mvcSiteMapNode title="SGD" controller="yyy" action="Details" preservedRouteParameters="pcId, yyyId, editable"> 
     <mvcSiteMapNode title="ESGN" controller="yyy" action="Title" preservedRouteParameters="pcId, yyyId, editable" /> 
    </mvcSiteMapNode> 

Действия:

[HttpGet] 
    [Route("xxx/{pcId:int}/yyy/{yyyId:int}/Details/{editable:bool}")] 
    public virtual ActionResult Details(int pcId, int yyyId, bool editable) 
    { 


    [HttpGet] 
    [Route("xxx/{pcId:int}/yyy/{yyyId:int}/Title")] 
    public virtual ActionResult Title(int pcId, int yyyId) 
    { 

Карта маршрута:

routes.MapRoute(
      name: "xxx", 
      url: "xxx/{action}/{pcId}", 
      defaults: new 
      { 
       controller = "xxx", 
       action = "Index", 
       pcId = UrlParameter.Optional 
      } 
      ); 

Update: При удалении "редактируемого" параметр он начал работать. Может быть проблема с более чем двумя параметрами? или, возможно, тип или имя параметра?

Update следующие советы отладки от NightOwl88:

urlHelper делает генерировать правильный URL,

Это мой код контроллера:

[HttpGet] 
    [Route("TransactionDetails/File/{fileId:int}")] 
    public virtual ActionResult Index(int fileId) 
    { 
     { 
      var urlHelper = new UrlHelper(new System.Web.Routing.RequestContext(this.HttpContext, this.RouteData)); 
      var url = urlHelper.Action("Index", "Transaction", 
       new System.Web.Routing.RouteValueDictionary { { "id", 678 } }); 

      System.Diagnostics.Debug.WriteLine(url); 
     } 

     { 
      var urlHelper = new UrlHelper(new System.Web.Routing.RequestContext(this.HttpContext, this.RouteData)); 
      var url = urlHelper.Action("Index", "File", 
       new System.Web.Routing.RouteValueDictionary {{"fileId", 123}}); 

      System.Diagnostics.Debug.WriteLine(url); 
     } 

я получаю: /AdministratorConsole/TransactionDetails/678 ​​ и /AdministratorConsole/TransactionDetails/File/123

Итак, помощник может создать для меня URL-адрес, но MvcSiteMapProvider все еще не доволен.

SiteMap является:

<mvcSiteMapNode title="Transaction Log" controller="TransactionLog" action="Index"> 
     <mvcSiteMapNode title="Transaction Details" controller="Transaction" action="Index" preservedRouteParameters="id"> 
     <mvcSiteMapNode title="File Details" controller="File" action="Index" preservedRouteParameters="id, fileId"> <!--TODO link back to parent not working--> 

ответ

0

# указывает, что URL-адрес не может быть решен на основе информации, предоставленной (между текущим запросом и тем, что в конфигурации узла). См. Why does Default UrlResolver throw an exception для объяснения.

MvcSiteMapProvider разрешает URL-адрес через класс MVC UrlHelper, поэтому, если у вас возникли проблемы, вы должны use the UrlHelper explicitly устранить неполадки. Если вы поместите приведенный ниже код в контроллер и отредактируйте его в соответствии с запросом, который генерирует #, вы сможете определить, как правильно разрешить URL. Однако, в отличие от MvcSiteMapProvider, UrlHelper вернет null, если URL-адрес не может быть разрешен. Наиболее вероятная причина заключается в том, что вам не хватает значения маршрута, которое вы установили как , а по маршруту -.

// Using controller and action 
var urlHelper = new UrlHelper(new System.Web.Routing.RequestContext(this.HttpContext, this.RouteData)); 
var url = urlHelper.Action("View", "Videos", new System.Web.Routing.RouteValueDictionary { { "id", 123 } }); 

// Using controller, action, and route name (similar to @Html.RouteLink()) 
var urlHelper = new UrlHelper(new System.Web.Routing.RequestContext(this.HttpContext, this.RouteData)); 
var url = urlHelper.RouteUrl("RouteName", new System.Web.Routing.RouteValueDictionary { { "controller", "Videos" }, { "action", "View" }, { "id", 123 } }); 
+0

Спасибо, что попробовали. Интересно, что узел, у которого есть проблема, получает хороший Url, когда его последний узел в списке, но не тот, когда он второй. –

+0

Я обновил свой вопрос. UrlHelper генерирует URL-адрес для меня, но MvcSiteMapProvider - нет. Что-нибудь еще я могу попробовать? –