【问题标题】:Best way to manage Magic Strings in JavaScript external JS file在 JavaScript 外部 JS 文件中管理魔术字符串的最佳方法
【发布时间】:2012-12-30 17:37:19
【问题描述】:

如果 T4MVC 不能扩展到外部 JavaScript 文件,我想找到管理“魔术字符串”的最佳方法,例如 JQuery .load() 方法中的 Controller/Action 值。

我想将更改 Action 以在应用程序中引发错误的风险降至最低。我知道我可以使用 Visual Studio 编译视图来查找客户端错误,但不能在 JS 外部文件中。

我发现了一些解决方案,例如将 View 作为 javascript 文件类型包含在内,这样我就可以使用 T4MVC 并检测 Views 编译错误,但是这种方法会使服务器产生不必要的请求,如果是 JS,它将被缓存在客户端。

我正在考虑一个常量 JS 文件,或者在极限情况下,一个带有 T4MVC 参数方法的常量 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 外部文件中,如何避免“魔术字符串”?

谢谢。

【问题讨论】:

  • 您能否包含代码示例以更清楚地说明您想要实现的目标?
  • 嗨,我刚刚放了一个示例来解释我想要实现的目标。谢谢。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我觉得你用的方法很好,就是我用的。它们并不是真正的魔法字符串,因为您使用的是基于路由的 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 资源的路径。

    【讨论】:

    • 我给出的示例只能在cshtml文件中工作,在JS外部文件中是不可能的。
    【解决方案3】:

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

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

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

    【讨论】:

    • 有没有一种简单的方法来包含使用这个对象的 T4MVC 方法?
    猜你喜欢
    • 2011-09-30
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多