【发布时间】:2016-04-10 19:23:18
【问题描述】:
我创建了一个辅助扩展,它允许我在 MVC razor 中使用 UrlHelper 进行强类型表达式。这非常适合从视图中解析我的 MVC 控制器的 URI。
<a href="@(Url.Action<HomeController>(c=>c.Index()))">Home</a>
<li>@(Html.ActionLink<AccountController>("Sign in", c => c.Signin(null)))</li>
<li>@(Html.ActionLink<AccountController>("Create an account", c => c.Signup(), htmlAttributes: null))</li>
@using (Html.BeginForm<ToolsController>(c => c.Track(null), FormMethod.Get, htmlAttributes: new { @class = "navbar-form", role = "search" })) {...}
我现在有一个视图,我正在尝试使用敲除将一些数据发布到我的 web api 并且需要能够执行类似的操作
var targetUrl = '@(Url.HttpRouteUrl<TestsApiController>(c => c.TestAction(null)))';
这样我就不必硬编码我的网址(魔术字符串)
我当前用于获取 Web API url 的扩展方法的实现定义如下。
private const string HttpRouteKey = "httproute";
public static string HttpRouteUrl<TController>(this UrlHelper urlHelper, Expression<Action<TController>> action)
where TController : System.Web.Http.ApiController {
RouteValueDictionary routeValues = InternalExpressionHelper.GetRouteValues(action);
if (!routeValues.ContainsKey(HttpRouteKey)) {
routeValues.Add(HttpRouteKey, true);
}
var scheme = urlHelper.RequestContext.HttpContext.Request.Url.Scheme;
var route = urlHelper.Action(null, null, rvd, scheme);
//I've also tried
//var route = urlHelper.HttpRouteUrl(null, rvd);
return route;
}
InternalExpressionHelper.GetRouteValues 检查表达式并生成将用于生成 url 的 RouteValueDictionary。
问题是我的route 总是返回null。以前关于 SO 和博客的问题表明,通过在字典中包含 httproute 将允许从 MVC.UrlHelper 路由集合中获取 WebApi Urls。
到目前为止,由于我正在使用没有路由名称的属性路由,因此似乎没有一个被接受的答案对我有用。
【问题讨论】:
-
仅供参考,已经有一个开源库可以做到这一点here。
-
我已经在挖掘源代码,看看它是如何完成的
标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing