5

Szybkie pytanie dotyczące tras w obrębie MVC i WebAPI. Dodałem trasę do config.cs trasy:Trasy MVC w kontrolerze WebAPI

 routes.MapRoute(
      name: "ConfirmEmail", 
      url: "ConfirmEmail/{userid}", 
      defaults: new { controller = "Email", action = "ConfirmEmail" } 
     ); 

ta jest zarejestrowana w global.asax jak za normalny:

RouteConfig.RegisterRoutes(RouteTable.Routes); 

Próbuję wygenerować URL do wykorzystania w e-mail, który jest wysyłany jako część wywołania funkcji w funkcji kontrolera WebAPI. Używam funkcji UrlHelper.Link próba wygenerowania URL, jednak otrzymuję błąd mówiąc trasy nie można znaleźć według nazwy:

var url = Url.Link("ConfirmEmail", new { userid = "someUserId" }); 

Teraz byłem pod słowników trasy wyciskowych były dzielone zarówno MVC i Konteksty kontrolera WebAPI nie widzą jednak tras MVC w słowniku trasy przychodzącego wywołania Web API (na obiekcie Request), ale istnieją zdefiniowane przeze mnie trasy WebAPI, które zdefiniowałem.

Czy brakuje mi czegoś?

Odpowiedz

1

Tabele routingu dla MVC i Web API są zupełnie inne. Chociaż składnia wygląda podobnie, to tabela tras, na której działają, jest inna.

Jednak MVC używa obiektów statycznych do konfiguracji, dzięki czemu można uzyskać dostęp do globalnej tabeli tras MVC z poziomu kontrolera API za pomocą System.Web.Routing.RouteTable.Routes.

Nie zezwoli ci to na używanie Url.Link, więc sugerowałbym użycie stałej w rejestracji trasy dla formatu.

+0

Tak, myślałem, że tak było ... Interesujące jest to, że można wygenerować adres URL strony internetowej w widoku MVC za pomocą tabel routingu ... No cóż! –

3

Korzystanie Richards podpowiedź gdzie znaleźć trasy, mam połączyć następującą funkcję:

// Map an MVC route within ApiController 
    private static string _MvcRouteURL(string routeName, object routeValues) 
    { 
     string mvcRouteUrl = ""; 

     // Create an HttpContextBase for the current context, used within the routing context 
     HttpContextBase httpContext = new System.Web.HttpContextWrapper(HttpContext.Current); 

     // Get the route data for the current request 
     RouteData routeData = HttpContext.Current.Request.RequestContext.RouteData; 

     // Create a new RequestContext object using the route data and context created above 
     var reqContext = new System.Web.Routing.RequestContext(httpContext, routeData); 

     // Create an Mvc UrlHelper using the new request context and the routes within the routing table 
     var helper = new System.Web.Mvc.UrlHelper(reqContext, System.Web.Routing.RouteTable.Routes); 

     // Can now use the helper to generate Url for the named route! 
     mvcRouteUrl = helper.Action(routeName, null, routeValues, HttpContext.Current.Request.Url.Scheme); 

     return mvcRouteUrl; 
    } 

To trochę surowy, ale pracy dla mnie, po prostu pomyślałem, że umieścić to tutaj w przypadku ktoś inny miał ten sam problem!

10

Oto znacznie bardziej przejrzysty sposób generowania linków do tras MVC z WebApi. Używam tej metody w niestandardowym kontrolerze bazowym api.

protected string MvcRoute(string routeName, object routeValues = null) 
{ 
    return new System.Web.Mvc.UrlHelper(System.Web.HttpContext.Current.Request.RequestContext) 
     .RouteUrl(routeName, routeValues, System.Web.HttpContext.Current.Request.Url.Scheme); 

} 
+0

Pracowałam jak urok dla mnie. – shaun