我正在对 MVC 操作进行 jquery 发布。该操作返回一个带有(例如)Id = 123 的 json 结果。代码仍处于早期阶段,但我很惊讶地发现 Url.Action("action", "controller") 正在构建一个完整的 url id 我从 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 可以访问现有的路由值并将尝试重用它们。为了解决这个问题,我使用了下面稍微有点hacky的解决方案:
var detailsUrl = "@Url.Action("Action", "Control", new { id = ""})" + "/" + data.id;
这会清除路由值,以便我可以在客户端附加新的值。不幸的是,将 null 或 new {} 作为 RouteValues 传递给 Url.Action 并不能解决这个问题。更好的方法可能是创建另一个 Action 帮助器,以保证不会附加任何路由值。或者,还有 Url.Content,但这样做会丢失 IDE 中的 Action/Controller 接线。