繁体   English   中英

ASP.NET内联服务器标签

[英]ASP.NET inline server tags

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

所以我的.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投诉最少)? eval和ajax调用都不适合这个imo。

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

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>

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

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

这比你的解决方案更多的工作,你将添加一些数据到回发(如果你执行任何)但它不会导致任何VS投诉我猜:)

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

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

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

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

(编辑)

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

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

并指的是:

servervars.GetProductsForEditRelationship

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM