如果没有我设置,Url.Action如何知道路由值?

时间:2012-06-15 12:55:32

标签: .net asp.net-mvc

我正在为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中失去动作/控制器接线。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

  

这是设计的吗?

由于路由基础设施,这种魔力发生了。有些人认为MVC路由只是处理传入的请求,但它也是关于生成传出的URL

html帮助程序,例如 ActionLink UrlHelper 这些都与路由模块集成在一起,当您尝试创建传出URL时,它们会检查您在中定义的路由架构Global.asax.cs并相应地创建URL。

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