5

MVC ve WebAPI içindeki rotalar ile ilgili hızlı soru. Ben rota config.cs bir rota ekledi: Bu normal başına global.asax kayıtlıWebAPI denetleyicisi içindeki MVC Yolları

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

: Ben bir e-posta içinde kullanılmak için bir URL oluşturur çalışıyorum

RouteConfig.RegisterRoutes(RouteTable.Routes); 

hangi WebAPI denetleyici işlevi içindeki bir işlev çağrısının parçası olarak gönderilir.

Şimdi izlenim rota sözlükleri altında hem MVC paylaşıldı edildi
var url = Url.Link("ConfirmEmail", new { userid = "someUserId" }); 

ve: Ben ancak rotayı belirten bir hata alırsınız, bir URL oluşturmak için girişimi UrlHelper.Link fonksiyonunu kullanıyorum adıyla bulunamaz Ancak WebAPI denetleyici bağlamları, gelen Web API çağrısı (İstek nesnesinde) yol sözlük içindeki MVC yollarını göremiyorum ancak tanımladığım WebAPI yolları var.

Bir şey mi eksik?

cevap

1

MVC ve Web API için yönlendirme tabloları tamamen farklıdır. Sözdizimi benzer görünürken, üzerinde çalıştıkları rota tablosu farklıdır.

Ancak, MVC, yapılandırma için statik nesneleri kullanır, böylece küresel MVC rota tablosuna bir API denetleyicisinden System.Web.Routing.RouteTable.Routes kullanarak erişebilirsiniz.

Bu, Url.Link'i kullanmanıza izin vermez, bu nedenle, biçim için rota kaydınızda bir sabit kullanmanız önerilir. yolları bulmak için nerede Richards ipucu kullanarak

+0

Yep, durumun böyle olduğunu düşündüm ... İlginç bir şekilde, yönlendirme tablolarını kullanarak MVC görünümünde bir web api URL'si oluşturabilirsin ... Ah evet! –

3

, birlikte aşağıdaki işlevi koyduk:

// 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; 
    } 

Biraz çiğ ama benim için bir iş yaptı, sadece ben diye burada bu koymak düşündüm başkasının aynı sorunu vardı!

10

WebApi'den MVC yollarına bağlantılar oluşturmanın çok daha temiz bir yolu. Bu yöntemi özel bir taban api denetleyicisinde kullanırım.

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

Benim için bir çekicilik gibi çalıştım. – shaun