1

我想首先说我的代码运行良好,这更像是一个“如何最好地做到这一点”的问题。

所以我的.aspx文件中有这样的代码:

    function EditRelationship() {
        var projects=<%= GetProjectsForEditRelationship() %>;

        // fill in the projects list
        $('#erProjectsSelect').empty();
        for(var i in projects)
            $('#erProjectsSelect').append('<option value='+projects[i][0]+'>'+projects[i][1]+'</option>');

        var rels=<%= GetRelationshipsForEditRelationship() %>;

        // etc
    }

再次,它工作正常。问题是 VS2008 在这样的代码上有点窒息,它<在标签中的字符下划线(带有相关的警告),然后拒绝为其余的 javascript 提供代码完成。它也拒绝再格式化我的文档,给出解析错误。最后一部分是我最大的烦恼。

我猜我可以把其中的一些放在evals 中,但是添加额外的层和运行时性能只是为了关闭 VS 似乎有点愚蠢,而且它并不总是一种选择(我不记得在我的脑海中这个不是一个选择,但相信我,我有一个奇怪的结构)。

所以我的问题是,你如何最好地写这个(最好的意味着最少的 VS 投诉)?ajax 调用都不eval适合这个 imo。

4

5 回答 5

2

您可以从代码隐藏中的页面执行此操作

ClientScript.RegisterArrayDeclaration("projects", "1, 2, 3, 4");

或者构建类似 JSON 的东西,你可以把它写出来

ClientScript.RegisterClientScriptBlock(GetType(), "JSONDeclarations", "your json stuff");

更新基于我的评论

<script id="declaration" type="text/javascript">
    var projects=<%= GetProjectsForEditRelationship() %>;
    var rels=<%= GetRelationshipsForEditRelationship() %>;
</script>
<script type="text/javascript">
    function EditRelationship() {
        // fill in the projects list
        $('#erProjectsSelect').empty();
        for(var i in projects)
            $('#erProjectsSelect').append('<option value='+projects[i][0]+'>'+projects[i][1]+'</option>');
}
</script>
于 2011-01-07T15:27:54.850 回答
2

如果您的目标是减少 VS 投诉,并且您正在运行 asp.net 4(支持静态客户端 ID),那么类似以下的策略可能会更好?

  1. 创建一个 ASP:HiddenField 控件,将其 ClientIdMode 设置为“Static”
  2. 在页面加载时将 GetRelationshipsForEditRelationship() 的值分配给该字段
  3. 在您的 javascript 中,改为从隐藏字段中读取值,我假设您知道如何执行此操作。

它比您的解决方案工作更多,您将在回发中添加一些数据(如果您执行任何操作),但我猜它不会引起任何 VS 投诉:)

于 2011-01-07T15:28:01.160 回答
0

最好的解决方案是将 javascript 放在一个单独的文件中并完全避免这种情况。对于这个特定的功能,您正在做服务器端的工作。为什么不构建您打算在代码隐藏中动态添加的选项列表,将它们放在隐藏的 div 中,然后让 jQuery 从已经呈现的 HTML 中添加它们?

如果您确实想以这种方式动态创建大量 javascript,请考虑在代码隐藏中使用 ScriptManager 将您需要的变量设置为脚本并注册它们,那么您的内联脚本将不需要转义

ScriptManager.RegisterClientScript("projects = " + GetProductsForEditRelationship());

(基本上,这不是完整的语法,它取决于上下文)。然后在你的函数中引用“项目”。

(编辑)

在更大范围内执行此操作的更简洁的方法,在代码隐藏中设置您需要的所有内容:

string script = "var servervars = {" +
  "GetProductsForEditRelationship: " + GetProductsForEditRelationship() + 
  "GetRelationshipsForEditRelationship: " + GetRelationshipsForEditRelationship() +
"}"

并参考以下所有内容:

servervars.GetProductsForEditRelationship

如果你经常这样做,当然,你可以创建一个类来自动构建脚本。

于 2011-01-07T15:29:09.437 回答
0

我没有安装 VS2008 来进行测试,所以对它持保留态度,但你有没有尝试过这样的事情?

var projects = (<%= GetProjectsForEditRelationship() %>);

类似的事情可能会诱使 JavaScript 解析器忽略表达式的内容。

对于它的价值,VS2010 正确解析并突出显示您的原始代码片段。

于 2011-01-07T15:36:57.280 回答
0

是否可以将其移至 VS2010?我刚刚复制并粘贴了您的代码,IDE 正确解释了它。

于 2011-01-07T15:37:29.183 回答