Domanda

Ho un routehandler personalizzato in ASP.NET MVC2 di catturare tutti gli URL in un percorso prefissato in questo modo:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new Route("@api/{*all}", new ApiHandler()));
routes.MapRoute(
  "Default", // Route name
  "{controller}/{action}/{id}", // URL with parameters
  new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

Routing funziona bene, ma se io uso Html.ActionLink o ritorno ReturnToAction () da un controllore, l'uri costruita crea un URI rotto in questo modo:

/@api?action=Add&controller=Home

anziché

/Home/Add

Come posso influenzare la logica dell'edificio uri a prendere in considerazione il modello di percorso predefinito?

È stato utile?

Soluzione

Sono venuto su con un hack per fermare il comportamento descritto. Mentre questo "risolve" il problema, è davvero sorta di brutto e preferirei un modo più pulito per escludere un percorso dalla logica dell'edificio percorso virtuale

routes.Add(
  new Route("@api/{*all}",
  // A random and unlikely controller name as the default
  new RouteValueDictionary() { { "controller", "qwewqewqeqweq" } },
  // and a constraint requiring any controller to be that random, default value
  new RouteValueDictionary() { { "controller", "qwewqewqeqweq" } }, 
  new ApiHandler()
);

Ciò significa che il percorso sarebbe stato scelto solo per la creazione Virtual Path se il controller in questione era "qwewqewqeqweq", che è si spera improbabile. Ho detto che era brutto.

Altri suggerimenti

è possibile specificare il nome del percorso utilizzando l'helper RouteLink:

<%: Html.RouteLink("link text", "Default", 
    new { action = "add", controller = "home" }) %>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top