在ASP.NET MVC中,我们需要@Url.Action
执行操作。是否有类似的东西@Url.Api
会路由到/ api / controller?
在ASP.NET MVC中,我们需要@Url.Action
执行操作。是否有类似的东西@Url.Api
会路由到/ api / controller?
Answers:
该ApiController有一个叫做物业地址是类型System.Web.Http.Routing.UrlHelper它允许你建立网址的API控制器。
例:
public class ValuesController : ApiController
{
// GET /api/values
public IEnumerable<string> Get()
{
// returns /api/values/123
string url = Url.Route("DefaultApi", new { controller = "values", id = "123" });
return new string[] { "value1", "value2" };
}
// GET /api/values/5
public string Get(int id)
{
return "value";
}
...
}
此UrlHelper在您的视图和标准控制器中都不存在。
更新:
为了在ApiController之外进行路由,您可以执行以下操作:
public class HomeController : Controller
{
public ActionResult Index()
{
string url = Url.RouteUrl(
"DefaultApi",
new { httproute = "", controller = "values", id = "123" }
);
return View();
}
}
或视图内:
<script type="text/javascript">
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
$.ajax({
url: url,
type: 'GET',
success: function(result) {
// ...
}
});
</script>
请注意httproute = ""
重要的路由令牌。
显然,这假定您的Api路由是DefaultApi
在的RegisterRoutes方法中调用的Global.asax
:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
System.Web.Mvc.UrlHelper
方法在HttpControllerContext外部生成Api路由。
它以更简单的形式工作,Url.Action
因此您不必引用任何路由名称:
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
area = ""
如果区域中需要URL,则可能需要添加一个。(默认情况下,Api控制器不在区域内。)我正在使用MVC 4。
Url.Action
正在被View使用。Url
属于类型System.Web.Mvc.UrlHelper
,并且不会映射到WebApi
路线。这就是为什么您需要额外的参数的原因new { httproute = "" }
。
httproute""
但它没有映射= /
@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null)
但效果很好
是否希望能够以类型安全的方式生成链接,而无需使用硬编码的字符串(控制器名称)?
有一个小问题!(由马克·西曼(Mark Seeman)撰写)
https://github.com/ploeh/Hyprlinkr
像这样工作:
路线,照常:
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
获取网址:
var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));
结果:
http://localhost/api/foo/1337