我首先要说的是我的代码工作正常,这更像是一个“如何做到最好”的问题。
所以我的.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。
答案 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),那么以下策略可能会更好吗?
这比你的解决方案更多的工作,并且你会在回发中添加一些数据(如果你执行任何操作),但我猜不会引起任何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正确地解释了它。