我正在为MVC动作做一个jquery帖子。该操作返回一个json结果(例如)Id = 123.代码仍然处于早期阶段,但我很惊讶地发现Url.Action(“action”,“controller”)正在构建一个url完整的我从Json回来了。这太神奇了吗?我找不到说它会这样做的文档。
// how I assumed it would need to be accomplished
// redirects to "Controler/Action/123123" where data = { id = 123 }
$.post(saveUrl, json, function (data) {
var detailsUrl = "@Url.Action("Action", "Control")" + data.id;
window.location = detailsUrl;
});
// rewritten without adding id to the route, not sure how this works...
// redirects to "Controler/Action/123" where data = { id = 123 }
$.post(saveUrl, json, function (data) {
var detailsUrl = "@Url.Action("Action", "Control")";
window.location = detailsUrl;
});
仅供参考,以下是行动:
[HttpPost]
public ActionResult Save(Model model)
{
return new JsonResult { Data = new { id = 123 }};
}
所以我想我的问题是,这是设计的吗?它是如何知道使用的?
正如答案中所指出的,Url.Action可以访问现有的路由值并尝试重用它们。为了解决这个问题,我使用了以下稍微讨厌的解决方案:
var detailsUrl = "@Url.Action("Action", "Control", new { id = ""})" + "/" + data.id;
这会清除路由值,以便我可以在客户端添加新的路由值。不幸的是,将null或新的{}作为RouteValues传递给Url.Action并不能解决这个问题。一个更好的方法可能是创建另一个Action助手,保证不会附加路由值。另外,还有Url.Content,但是你会在IDE中失去动作/控制器接线。
答案 0 :(得分:1)
UrlHelper
(Url
的类型)可以访问用于访问当前操作的路径数据。它将尝试使用这些值为您填写必要的路线值,除非您另行指定。
答案 1 :(得分:0)
这是设计的吗?
由于路由基础设施,这种魔力发生了。有些人认为MVC路由只是处理传入的请求,但它也是关于生成传出的URL 。
html帮助程序,例如 ActionLink 和 UrlHelper 这些都与路由模块集成在一起,当您尝试创建传出URL时,它们会检查您在中定义的路由架构Global.asax.cs并相应地创建URL。
当您在Global.asax.cs中定义的架构更改时,生成的URL会相应更改,因此当您在应用程序中创建链接时,请依赖此帮助程序,而不是直接在控制器或视图中对其进行硬编码。