【问题标题】:How can Url.Action already know the routevalues without me setting them?如果没有我设置它们,Url.Action 怎么能知道路由值?
【发布时间】:2012-06-15 12:55:32
【问题描述】:

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

【问题讨论】:

    标签: .net asp.net-mvc


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这很有意义。在这里,我在想它以某种方式从 JSON 中获取了路由值。顺便说一句,很棒的用户名。
    【解决方案2】:

    这是设计的吗?

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

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

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

    【讨论】:

    • 我觉得奇怪的是,尽管我要求助手这样做,但它仍在路由值中下降。是否有一个助手可以创建我要求的内容(即动作和控制器)?我以前使用过 RenderUrl,但它似乎不在 Razor 中。
    • 对不起,我误解了你的问题。您能否解释一下您要达到的目标。我相信你在代码中做错了什么。
    • 嗯,这不是我的具体问题,所以无需道歉。我想做的是在 js 中安全地生成一个 url,过去我用 RenderUrl 生成了一个 url。它不在 Razor 中,所以我尝试了 UrlHelper 的 Action 方法,但它包含来自当前路由值的 id。目前,我刚刚使用了一个 js 字符串,但过去在使用这种方式部署服务器时遇到过问题。
    • 据我了解,路由框架不会在您的情况下将“id”附加到生成的 url,我想知道它是如何发生的。
    猜你喜欢
    • 2012-11-09
    • 2012-09-06
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2011-04-03
    • 2013-08-06
    • 1970-01-01
    相关资源
    最近更新 更多