问题:
从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代码。
谢谢!
答案 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);
}