C# 在视图中为具有属性路由的Web Api构造url

C# 在视图中为具有属性路由的Web Api构造url,c#,asp.net-mvc,asp.net-web-api,attributerouting,C#,Asp.net Mvc,Asp.net Web Api,Attributerouting,如何从视图中的web api获取url 示例(摘自: 现在我想在我的视图中构造“/评论/编辑”,我如何才能做到这一点 我尝试过创建一个小的扩展方法,但它要求我为每个路由指定一个实际的“RouteName”。有没有一种方法我可以使用(比如在MVC中),我可以只传递控制器和动作 @Url.Action("Edit", "Reviews) 我现在使用的方法(与RouteName一起使用)也不允许使用整数作为参数(除非传递默认值)。如果我确实需要命名所有路由,我如何创建路由url,但在请求的“数据”部

如何从视图中的web api获取url

示例(摘自:

现在我想在我的视图中构造“/评论/编辑”,我如何才能做到这一点

我尝试过创建一个小的扩展方法,但它要求我为每个路由指定一个实际的“RouteName”。有没有一种方法我可以使用(比如在MVC中),我可以只传递控制器和动作

@Url.Action("Edit", "Reviews)
我现在使用的方法(与RouteName一起使用)也不允许使用整数作为参数(除非传递默认值)。如果我确实需要命名所有路由,我如何创建路由url,但在请求的“数据”部分传递参数

现行方法:

public static string ResolveWebApiRoute(this UrlHelper urlHelper, string routeName, object routeValues = null)
{
    var newRouteValues = new RouteValueDictionary(routeValues);
    newRouteValues.Add("httproute", true);

    return urlHelper.RouteUrl(routeName, newRouteValues);
}
编辑

当我使用像
Url.RouteUrl(new{controller=…,action=…})
这样的方法时,它会直接重定向到该操作(例如
new{controller=“Reviews”,action=“Show”}-->/reviews/show
,而我希望它在使用时重定向到WebApi2中的
/reviews/…
,路由名称默认命名为
控制器。操作
,但您也可以指定
路由名称

[RoutePrefix("reviews")]
public class ReviewsController : Controller
{
    // The route name is defaulted to "Reviews.Index" 
    [Route]
    public ActionResult Index() { ... }

    // The route name is "ShowReviewById"
    [Route("{reviewId}"), RouteName("ShowReviewById")]
    public ActionResult Show(int reviewId) { ... }

    // The route name is by default "Reviews.Edit"
    [Route("{reviewId}/edit")]
    public ActionResult Edit(int reviewId) { ... }
然后,要在视图中调用它,只需设置路由名称并将参数作为匿名对象发送:

// Outputs: /reviews/123
@Url.Action("ShowReviewById", new { reviewId = 123 })
// Outputs: /reviews/123/edit
@Url.Action("Reviews.Edit", new { reviewId = 123 })

生成指向Web API路由的链接总是需要一个
RouteName
,因此您应该有如下内容:

[Route("{reviewId}/edit", Name="EditView")]
public IHttpActionResult Edit(int reviewId) { ... }
然后,您可以生成一个链接,如Web API的
/reviews/1/edit

Url.RouteUrl(routeName: "EditView", routeValues: new { httpRoute = true, reviewId = 1 });


请注意,需要显式指定路由名称,并且它们不再像@Karhgath所建议的那样自动生成。这是从RC版本到RTM版本的更改。

使用路由属性时,我能够使用以下内容从MVC视图获取WebApi2控制器的路由:

Url.HttpRouteUrl("RouteName", new { })

好的,我认为从上面看很清楚,但我更新了答案,将编辑路由示例包括在内。如果不清楚,我想从您那里获得更多信息。是的,我把示例搞砸了(我以为它是一个API控制器,但我复制了一个MVC示例)。我的问题仍然是,如何在web API中获取Url?不@Url.Action(“Reviews.Edit”,新的{reviewId=123})工作???(应该给出一个指向“/Reviews/123/Edit”的url当使用属性路由时,路由名称默认是用“Controller.Action”这样的名称生成的,所以“Reviews.Edit”应该可以正常工作不?我怀疑我不理解您的真正问题。@Karhgath
@url.Action(“Reviews.Edit”)“,新的{reviewId=123})
匿名属性无效。看起来有点混乱…您试图生成指向MVC操作的链接,而不是Web API。
httproute
用于生成指向Web API控制器的链接,而不是您案例中的MVC。这是错误的复制/粘贴,它肯定是Web API控制器,而不是MVC控制器,谢谢如果我还不知道这个Id,我需要做什么(我想在javascript中将它用作参数)?@Kiran,你确定这是唯一的方法吗?@ebramkhalil,如果是,我如何避免重复的路由名称?@ebramkhalil将路由名称保存在一个静态类中,如
RouteNameConstants
或其他什么。它仍然不能确保没有重复的路由名称,但至少所有的魔法字符串都在一个位置,而且你也不会复制/粘贴字符串。
Url.HttpRouteUrl(routeName: "EditView", routeValues: , reviewId = 1)
Url.HttpRouteUrl("RouteName", new { })