0

问题:

什么是从 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 代码。

谢谢!

4

1 回答 1

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);
}
于 2012-06-27T12:46:22.300 回答