11

我正在使用asp.net mvc4,我在'controller1'中有这个动作:

    [HttpGet]
    public async Task<string> Action1()
    {
        try
        {
            HttpClient cl = new HttpClient();
            string uri = "controller2/action2";
            HttpResponseMessage response = await cl.GetAsync(uri);
            response.EnsureSuccessStatusCode();
            return response.ToString();
        }
        catch
        {
            return null;
        }
    }

当我将 uri 设置"http://localhost:1733/controller2/action2"为操作时工作正常,但永远不会将 uri 设置为“controller2/action2”或“/controller2/action2”或“~/controller2/action2”。

我如何在不对 uri 进行硬编码的情况下编写此操作?

谢谢你。

4

2 回答 2

14

利用:

string uri = Url.Action("Action2", "Controller2", new {}, Request.Url.Scheme);

更新:

由于您使用的是 API 控制器并且需要为常规控制器生成 Url,因此您将不得不使用:

string uri = this.Url.Link("Default", new { controller = "Controller2", action = "Action2" });

Default在您注册的路由集合中定义的名称在哪里route,或者如果您已经为此操作创建了特定路由,请使用它的名称和new{}作为第二个参数。

对于 MVC 版本 4,请检查您在~/App_Start/RoutesConfig.cs. 对于 MVC 版本 3,请RegisterRoutesGlobal.asax.

于 2013-07-19T08:12:14.633 回答
14

另一个可能更简单的答案是在 WebApi 类中创建 UrlHelper 的实例:

var url = new UrlHelper(System.Web.HttpContext.Current.Request.RequestContext);
item.Url = url.Action("Doc", "Editor", new {id=1});

传入当前请求上下文,你就是金牌。

于 2014-02-19T19:00:16.117 回答