2

我正在对 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 接线。

4

2 回答 2

1

(这UrlHelper是 的类型Url)可以访问用于访问当前操作的路由数据。除非您另行指定,否则它将尝试并使用这些值来为您填写必要的路线值。

于 2012-06-15T12:58:45.057 回答
0

这是设计使然吗?

这种神奇的发生是因为路由基础设施。有些人认为 MVC 路由仅用于处理传入请求,但也涉及生成传出 URL

ActionLinkUrlHelper等 html 助手都与路由模块集成,当您尝试创建传出 URL 时,它们会检查您在 Global.asax.cs 中定义的路由模式并相应地创建 URL。

当您在 Global.asax.cs 中定义的架构更改时,生成的 URL 会相应更改,因此当您在应用程序中创建链接时,请依赖此帮助程序,而不是直接在控制器或视图中硬编码它们。

于 2012-06-15T13:27:23.597 回答