ASP.NET内联服务器标签
-
30-09-2019 - |
题
首先,我想说我的代码正常工作,这更多是“如何最好地做”的问题。
所以我有这样的代码 .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),则可能会更好?
- 创建一个ASP:Hidden Field Control,将其clientIdmode设置为“静态”
- 将getRyahipsforedItryationship())的值分配到页面上的此字段
- 在您的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
当然,如果您这样做很多,则可以创建一个课程以自动化脚本的构造。