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

时间:2009-10-19 14:30:32

标签: javascript asp.net dom code-generation

有什么好方法可以处理这种混乱,不必要且非真实动态的JavaScript生成:

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

<%# JavascriptId %>.Init();

我找到了other question,但答案似乎没有解决嗅觉的来源。

我看到一些具体问题:

  • JavascriptId 是变量名称。我为什么要在服务器端定义客户端变量名?
  • CurrentUserId 不会为用户更改...这是他们的用户ID。同样适用于 GetBaseUrl ()和 ResolveUrl (“〜”)...为什么要在整个地方传递常量?
  • 我必须打开aspx.cs代码隐藏文件来调试内容,并且不能使用Intellisense。

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

3 个答案:

答案 0 :(得分:1)

你问的是代码气味,所以我猜代码情况的模糊性是恰当的。例如,与BusinessChart有什么关系。这里有很多我们不知道的东西。但这就是我闻到: 只提到你提到的第一个问题对我来说真的很糟糕。很奇怪,必须在服务器上指定。我想可能是一个原因,但我很难想象它。至于变量CurrentUserID,可能很容易就有这么好的理由。例如,BusinessChart可以根据用户的角色过滤不同的数据。

对于GetBaseUrl和ResolvUrl,这也可能是合法的。 BusinessChart可能需要一个完全限定的URL,并且GetBaseUrl / ResolveUrl是提供这一功能的中心位置,因此您只需要在一个位置进行配置更改。为什么不使用web.config引用呢? Errrr,也许有多个使用这些路径的Web应用程序或部署,Helper类从一个公共数据库获取这些URL,为多个应用程序或部署提供一个公共配置位置。

至于使用代码隐藏。 。 。有时这是必要的。虽然通常像这样的动态代码是不必要的,但有时候复杂性那里会实现最大的整体简单性。

我试图将现有代码的疑问带给您,正如您所看到的那样。但是,我不会惊讶地发现,正如您所怀疑的那样,您示例中的所有动态代码确实绝对无用。我会说你的嗅觉似乎很好!而你说的第一个问题是最糟糕的。

答案 1 :(得分:1)

我不知道它是否能解决您的确切问题,但Rick Strahl的this article可能会引起您的兴趣。

答案 2 :(得分:1)

也许您应该更多地关注数据驱动的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;
}

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

现在你非常接近AJAX应用程序。