在JavaScript外部JS文件中管理Magic Strings的最佳方法

时间:2012-12-30 17:37:20

标签: javascript asp.net-mvc asp.net-mvc-4 views t4mvc

T4MVC是不是可扩展到外部JavaScript文件,我想找到管理“Magic Strings”的最佳方法,如JQuery .load()方法中的Controller / Action值。

我想尽量减少更改操作的风险,以便在应用程序中发现错误。我知道我可以使用Visual Studio编译视图以查找客户端错误,但不能在JS外部文件中编译。

我发现了一些解决方案,例如将View作为javascript文件类型包含在内,因此我可以使用T4MVC并检测Views compilaion错误,但这种方法会使服务器成为不必要的请求,如果是JS则会在客户端缓存。 / p>

我正在考虑一个常量的JS文件,或者在限制中,使用T4MVC params方法的常量View文件。

有更好的意识吗?

我在这里留下一个样本:

<script type="text/javascript">
$(function () {
    $('#Category_Id')
        .cascade(
        {
            url: '@Url.Action(MVC.Ad.ListCategoryTypeByCategory())',
            paramName: '@MVC.Ad.ListCategoryTypeByCategoryParams.categoryId',
            firstOption: '@HeelpResources.DropdownlistCategoryTypeFirstRecord',
            childSelect: $('#CategoryType_Id')
        })
        .cascade(
        {
            url: '@Url.Action(MVC.Ad.ListMakeByCategory())',
            paramName: '@MVC.Ad.ListMakeByCategoryParams.categoryId',
            firstOption: '@HeelpResources.DropdownlistMakeFirstRecord',
            childSelect: $('#Make_Id')
        });

    $('#Make_Id').cascade({
        url: '@Url.Action(MVC.Ad.ListModelByMake())',
        paramName: '@MVC.Ad.ListModelByMakeParams.makeId',
        firstOption: '@HeelpResources.DropdownlistModelFirstRecord',
        childSelect: $('#Model_Id')
    });
});
</script>

如果我想将此代码放在JS外部文件中,我该如何避免使用“Magic Strings”?

感谢。

3 个答案:

答案 0 :(得分:0)

我知道你已经尝试过了,但是如果你想使用T4MVC我会认为从服务器端.cshtml文件返回JS可能是你最好的选择。请注意,这样做并不意味着它不会被缓存在客户端(如果你得到正确的标题)。实际上,从客户端的角度来看,返回一个纯JS文件并返回一个来自.cshtml的文件并不是真正可以区分的。无论哪种方式,它都会让JS回归。

答案 1 :(得分:0)

我认为您使用的方法很好,它是我使用的方法。它们不是真正神奇的字符串,因为您正在使用基于路由的Url生成,并且您永远不必担心javascript中的Url会过时。

另一种方法可能是使用一个返回JsonResult的控制器动作:

    public JsonResult GetConcentrationsMap() {
        var magicStrings = _magicStringsService.GetAll().Select(c => new { Name= c.Name, Url = c.Url });

        return Json(new { urls = magicStrings }, JsonRequestBehavior.AllowGet);
    }

这将缓存在客户端上,但正如David Ebbo所说,你也可以用.cshtml来实现。我认为它更麻烦,因为你仍然需要管理告诉你的javascript代码到具有魔术字符串的.js或json资源的路径。

答案 2 :(得分:0)

您可以使用JavaScriptModel(http://jsm.codeplex.com)。 如果你需要全局这些“魔术字符串”,你应该考虑编写一个过滤器并将其添加到那里。

下面是一个如何使用JavaScriptModel编写过滤器的示例:

http://jsm.codeplex.com/wikipage?title=Use%20JavaScriptModel%20in%20a%20global%20filter&referringTitle=Documentation