没有静态控制器URL的ASP.NET MVC AJAX调用(魔术字符串)

时间:2012-06-27 12:38:37

标签: ajax asp.net-mvc

问题:

从JavaScript调用我的MVC控制器/操作的清晰,安全和系统的方法是什么,但是当控制器发生变化时,将相关的URL保留在中心位置以进行更新?或者在运行时动态生成URL?或者获得AJAX控制器链接的编译时检查?

研究/过去的尝试:

我最近将T4MVC插入到我的MVC项目中。大!在我的视图中对控制器链接进行编译时检查 - 但我仍然在我的JavaScript中遍布控制器URL。更糟糕的是,我已经演变了我在项目生命周期中如何做到这一点,所以我做了多种方式,我仍然不满意。


1)单向:

locationAutoComplete = new AjaxQueue({
 Controller: "Utilities", // null for current controller
 Action: "GetMatchingLocations",
 DataModel: null, // null for raw JSON, or a local model to populate
 MaxQueuedRequests: 0
});

2)另一种方式:

locationAutoComplete = function (location) {
 return $.ajaxPost(resolveUrl("~/Utilities/GetMatchingLocations"));
}

3)上面的1和2都使用了Master / Layout JavaScript代码段中定义的项目根,但仍使用未经检查的URL字符串。所以现在我开始通过在我的.CSHTML视图中定义控制器字符串而从T4MVC中受益:

var locationLookupController = @Url.Action(MVC.Utilities.GetMatchingLocations());

4)SO文章(Ajax call Into MVC Controller- Url Issue)解决了这个问题。它讨论了方法3,但也建议使用AjaxHelper命名空间。由于我大量使用jQuery AJAX和一些非常自定义的交互(例如将结果加载到本地数据模型中,而不是在点击事件中但是以定时间隔加载),我认为它不会对我有多大帮助。今天我甚至没有在我的任何页面上包含MS AJAX JavaScript代码。

谢谢!

1 个答案:

答案 0 :(得分:1)

继续使用T4MVC。将它与一些jQuery和HTML5 data- *属性混合使用。这是一个例子:

<div data-location-lookup-url="@Url.Action(MVC.Utilities.GetMatchingLocations())">

...

locationAutoComplete = function (location) {
    var url = $('[data-location-lookup-url]').data('location-lookup-url');
    return $.ajaxPost(url);
}