代码之家  ›  专栏  ›  技术社区  ›  Jeff Meatball Yang

从服务器脚本(ASP.NET)传递javascript变量名和值

  •  2
  • Jeff Meatball Yang  · 技术社区  · 15 年前

    处理这种混乱、不必要且不是真正动态生成的javascript有哪些好方法:

    var <%# JavascriptId %> = new BusinessChart(
        '<%# JavascriptId %>',<%# CurrentUserId %>,'<%# ChartId %>'
        ,'<%# Helper.GetBaseUrl() %>','<%# ChartPath %>'
        ,'<%# Helper.ResolveUrl("~", true) %>'
    );
    
    <%# JavascriptId %>.Init();
    

    我发现了这个 other question 但这些答案似乎并不能说明臭味的来源。

    我看到一些具体问题:

    • JavaScript 是变量名。为什么要在服务器端定义客户端变量名?
    • 这个 当前用户 永远不会为用户改变…这是他们的用户ID。和 盖茨巴利 ()和 解析URL (“~”)…为什么我要把常量传遍整个地方?
    • 我必须打开aspx.cs代码隐藏文件来调试东西,并且不能使用intellisense。

    我已经开发了一些方法来处理上述问题(声明一个全局“应用程序”对象,jquery+在dom元素上声明类),但是我想听听关于这个问题的更多想法。

    3 回复  |  直到 9 年前
        1
  •  1
  •   Robert W    15 年前

    我不知道它是否能解决你的确切问题,但是 this article 里克·斯特拉尔可能感兴趣。

        2
  •  1
  •   Patrick Karcher    15 年前

    你在问密码 气味 因此,我认为代码情况的模糊性是适当的。例如,业务图表的处理方式是什么?这里有很多我们不知道的东西。但这就是我 气味 : 你提到的第一期对我来说很难闻。必须在服务器上指定这一点非常奇怪。我想在那儿 能够 这是一个原因,但我很难想象。至于变量currentuserid,很容易有很好的理由。例如,BusinessChart可能根据用户的角色过滤不同的数据。

    至于getbaseurl和resolverurl,这也是合法的。BusinessChart可能需要一个完全限定的URL,而GetBaseURL/ResolveURL是提供该URL的中心位置,因此您只需要在一个位置进行配置更改。为什么不使用web.config引用呢?errr,可能有多个Web应用或部署使用这些路径,而helper类从公共数据库获取这些URL,提供 多个应用程序或部署的通用配置位置。

    至于使用代码隐藏。..。有时候这是必要的。虽然这样的动态代码通常是不必要的,但有时会有复杂的问题 那里 达到最大 总体的 简单。

    正如你所看到的,我试图给现有代码带来疑问。但是,我不会惊讶地发现,正如您所怀疑的,您示例中的所有动态代码实际上都是毫无用处的。我觉得你的嗅觉很好!你说的第一个问题闻起来最难闻。

        3
  •  1
  •   Frank Krueger    15 年前

    也许您应该更关注数据驱动的JavaScript。将您的数据存储为JSON,并让您的代码执行“代码化”操作:

    // This is the dynamic data part
    var charts = [{
      Id: '<%# JavascriptId %>',
      UserId: <%# CurrentUserId %>,
      ChartId: '<%# ChartId %>',
      BaseUrl: '<%# Helper.GetBaseUrl() %>',
      ChartPath: '<%# ChartPath %>',
      HomePath: '<%# Helper.ResolveUrl("~", true) %>'
    }];
    
    // This is just code that can be stored away 
    // in the application's static javascript
    function initChart(data) {
      var chart = new BusinessChart(
          data.Id, data.UserId, data.ChartId, 
          data.BaseUrl, data.ChartPath, data.HomePath);
      char.Init();
      return chart;
    }
    

    更好的是,不要将它放在HTML文件中,而是编写一个返回这个JSON的REST请求处理程序。

    现在您已经非常接近Ajax应用程序了。