首先,我想说我的代码正常工作,这更多是“如何最好地做”的问题。

所以我有这样的代码 .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的其余部分提供代码完成。 它还拒绝再格式化我的文档,给出解析错误. 。最后一部分是我最严重的烦恼。

我可以把其中一些放在 eval我猜想,但是添加其他层和运行时性能仅仅是为了关闭而不是总是一个选择(我不记得我的头顶,这不是一个选择,但这似乎不是一个选择,这似乎有些愚蠢我有一个怪异的结构)。

所以我的问题是, 你怎么最好写这个 (最佳的vs投诉最少)?两者都不 eval Ajax称其为适合此IMO。

有帮助吗?

解决方案

如果您的目的是减少VS投诉,并且您正在运行ASP.NET 4(支持静态客户端ID),则可能会更好?

  1. 创建一个ASP:Hidden Field Control,将其clientIdmode设置为“静态”
  2. 将getRyahipsforedItryationship())的值分配到页面上的此字段
  3. 在您的JavaScript中,请读取隐藏字段的值,我假设您知道该怎么做。

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

其他提示

您可以在代码范围内的页面中执行此操作

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>

我没有安装VS2008进行测试,所以请加一点盐,但是您尝试过类似的东西吗?

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

这样的事情可能会欺骗JavaScript解析器忽略您表达式的内容。

就其价值而言,VS2010正确解析并突出显示您的原始代码段。

将其移至VS2010是一种选择吗?我只是复制并粘贴了您的代码,而IDE正确解释了它。

最好的解决方案是将JavaScript放在单独的文件中,并完全避免使用。对于此特定功能,您正在执行服务器端工作。为什么不构建您打算在CodeBehind中动态添加的选项列表,将它们放入隐藏的DIV中,然后将JQuery添加到已经渲染的HTML中?

如果您确实想通过这种方式动态创建很多JavaScript,请考虑使用CodeBehind中的ScriptManager来设置您需要作为脚本并注册它们的变量,那么您的内线脚本就不会逃脱

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

(基本上,这不是完整的语法,而是上下文依赖的)。然后参考您的功能中的“项目”。

(编辑)

一种更清洁的方法来大规模执行此操作,在CodeBehind中设置您需要的所有内容:

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

并参考所有类似的内容:

servervars.GetProductsForEditRelationship

当然,如果您这样做很多,则可以创建一个课程以自动化脚本的构造。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top