ASP.NET内联服务器标签

时间:2011-01-07 15:20:13

标签: javascript asp.net servertag

我首先要说的是我的代码工作正常,这更像是一个“如何做到最好”的问题。

所以我的.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而添加额外的图层和运行时性能命中似乎很笨,而且它并不总是一个选项(我不记得了)脱离我的头顶,这不是一个选择,但相信我,我有一个奇怪的结构)。

所以我的问题是,你最好怎么写(哪里最好意味着VS投诉最少)? <{1}}和ajax调用都不适合这个imo。

5 个答案:

答案 0 :(得分: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>

答案 1 :(得分:2)

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

  1. 创建一个ASP:HiddenField控件,将其ClientIdMode设置为“Static”
  2. 在页面加载时将GetRelationshipsForEditRelationship()的值分配给此字段
  3. 在您的javascript中,请从隐藏字段中读取值,我假设您知道如何执行此操作。
  4. 这比你的解决方案更多的工作,并且你会在回发中添加一些数据(如果你执行任何操作),但我猜不会引起任何VS投诉:)

答案 2 :(得分:0)

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

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

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

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

(编辑)

更大规模地执行此操作,在代码隐藏中设置您需要的所有内容:

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

并参考以下所有内容:

servervars.GetProductsForEditRelationship

如果你这么做了很多,当然,你可以创建一个类来自动构建脚本。

答案 3 :(得分:0)

我没有安装VS2008进行测试,所以带上一粒盐,但是你尝试过这样的东西吗?

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

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

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

答案 4 :(得分:0)

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