关于MVC和WebAPI中的路由的快速问题。我添加了路由config.cs的路由:
routes.MapRoute(
name: "ConfirmEmail",
url: "ConfirmEmail/{userid}",
defaults: new { controller = "Email", action = "ConfirmEmail" }
);
这是按照正常情况在global.asax中注册的:
RouteConfig.RegisterRoutes(RouteTable.Routes);
我正在尝试生成一个在电子邮件中使用的URL,该电子邮件是作为WebAPI控制器函数中的函数调用的一部分发送的。我正在使用UrlHelper.Link函数尝试生成一个URL,但是我收到一条错误消息,指出无法通过名称找到该路径:
var url = Url.Link("ConfirmEmail", new { userid = "someUserId" });
现在我的印象是路由字典在MVC和WebAPI控制器上下文中共享但是我看不到传入Web API调用的路由字典中的MVC路由(在Request对象上)但是我定义的WebAPI路由在那里。
我错过了什么吗?
答案 0 :(得分:11)
这是从WebApi生成到MVC路由的链接的更简洁方法。我在自定义基本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);
}
答案 1 :(得分:3)
使用Richards提示找到路线的位置,我将以下功能放在一起:
// 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;
}
它有点原始,但为我完成了这项工作,只是想我会把它放在这里以防其他人遇到同样的问题!
答案 2 :(得分:1)
MVC和Web API的路由表完全不同。虽然语法看起来类似,但它们操作的路由表是不同的。
但是,MVC使用静态对象进行配置,因此您可以使用System.Web.Routing.RouteTable.Routes
从API控制器中访问全局MVC路由表。
但是,这不允许您使用Url.Link,因此我建议您在路线注册中使用常量格式。