我正在使用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设置为&#34; controller2 / action2&#34;或&#34; / controller2 / action2&#34;或&#34;〜/ controller2 / action2&#34;。
如何在不对uri进行硬编码的情况下编写此操作?
谢谢。
答案 0 :(得分: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{}
作为第2个参数。
对于MVC版本4,请检查~/App_Start/RoutesConfig.cs
处的注册路线。对于MVC版本3,请检查RegisterRoutes
中的Global.asax
方法。
答案 1 :(得分:12)
另一个也许更简单的答案是在WebApi类中创建UrlHelper的实例:
var url = new UrlHelper(System.Web.HttpContext.Current.Request.RequestContext);
item.Url = url.Action("Doc", "Editor", new {id=1});
传递当前的请求上下文,你就是金子。