高分求解:匪夷所思的GridView数据绑定、FormatString和JS脚本问题

sworddx 2007-08-13 10:36:47
我在一个gridView里面有一个模板列,部分内容如下:
<asp:TemplateField HeaderText="详情">
<ItemTemplate>
<asp:Label ID="place" runat="server" Text='<%#Bind("单位")%>'></asp:Label>
</ItemTemplate>
<ItemStyle Width="100px" />
</asp:TemplateField>
这个单位字段可能因为长度过大而导致换行,影响视觉效果,因此有了一个JS函数limitStr来限制它的长度。该函数接受三个参数:第一个是要限制长度的字符串,在这里当然应该是{0},第二个是要限制到的长度(字节),指定为24,第三个是是(true)否(false)在被截断的字符串之后添加一个省略号。按照往常经验,这个模板列改为:
<asp:TemplateField HeaderText="详情">
<ItemTemplate>
<asp:Label ID="place" runat="server" Text='<%#Bind("单位","<script>document.write(limitStr('{0}',24,true));</script>")%>'></asp:Label>
</ItemTemplate>
<ItemStyle Width="100px" />
</asp:TemplateField>

此时<asp:Label....这句出错:

分析器错误
说明: 在分析向此请求提供服务所需资源时出错。请检查下列特定分析错误详细信息并适当地修改源文件。

分析器错误信息: 服务器标记的格式不正确。

疑为“'{0}'”处单引号与“Text='”处单引号冲突了,于是改为:

<asp:TemplateField HeaderText="详情">
<ItemTemplate>
<asp:Label ID="place" runat="server" Text='<%#Bind("单位","<script>document.write(limitStr(" & chr(34) & "{0}" & chr(34) & ",24,true));</script>")%>'></asp:Label>
</ItemTemplate>
<ItemStyle Width="100px" />
</asp:TemplateField>

这时候更棘手的问题出现了,在IE中查看该页,VS和ASP.NET Development Server同时停止相应(CPU占用率很高);强制关闭后如果用VS打开此页,VS直接挂掉,必须用记事本将该句改回才能用VS打开。想了半天想不出这是个什么问题,麻烦各位大大会诊一下。解决后另有一百分作为感谢。
...全文
760 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
sworddx 2007-08-13
  • 打赏
  • 举报
回复
先就这样吧,谢谢大家。
麻烦主要贡献者cpp2017(慕白兄)来http://community.csdn.net/Expert/TopicView.asp?id=5706631领分。
cpp2017 2007-08-13
  • 打赏
  • 举报
回复
<asp:Label ID="place" runat="server" Text='<%# String.Format("<script>document.write(limitStr({0},24,true));</script>",Eval("单位").ToString())%>'></asp:Label>
cpp2017 2007-08-13
  • 打赏
  • 举报
回复
因为vs.net编辑器会占用100%我只能解释为bug,就像写正则时不小心写错一样,当然你那种方法也是可以实现的, 用string来拼凑应该是可以的。
sworddx 2007-08-13
  • 打赏
  • 举报
回复
to cpp2017(慕白兄):
这种方法可行。可是我的那种方法为什么出问题?只能解释为bug么?
cpp2017 2007-08-13
  • 打赏
  • 举报
回复
<ItemTemplate> <script> document.write(limitStr('<%#Eval("字段")%>',24,true)) </script> </ItemTemplate>
sworddx 2007-08-13
  • 打赏
  • 举报
回复
Jinglecat(晓风残月 >> 问题需简洁,错误要详细)

try ->

<asp:Label ID="place" runat="server" Text='<%# Eval("单位","<script>document.write(limitStr('{0}',24,true))</" + "script>") %>' > </asp:Label>

=====quoted===========================

分析器错误
说明: 在分析向此请求提供服务所需资源时出错。请检查下列特定分析错误详细信息并适当地修改源文件。

分析器错误信息: 服务器标记的格式不正确。
cpp2017 2007-08-13
  • 打赏
  • 举报
回复
<ItemTemplate> <script> document.write(limitStr('<%#Eval("字段")%>')) </script> </ItemTemplate>
cpp2017 2007-08-13
  • 打赏
  • 举报
回复
不要用控件。如果不取值的话。
Jinglecat 2007-08-13
  • 打赏
  • 举报
回复
事实上,无特殊需求, Label 控件都不要

<asp:TemplateField HeaderText="详情">
<ItemTemplate>
<%# Eval("单位","<script>document.write(limitStr('{0}',24,true))</" + "script>") %>
</ItemTemplate>
<ItemStyle Width="100px" />
</asp:TemplateField>
cpp2017 2007-08-13
  • 打赏
  • 举报
回复
哦。上面的错了,你是用的Lable
cpp2017 2007-08-13
  • 打赏
  • 举报
回复
另外,Text的值是写在Value=""中的,这里面的js 脚本也不会执行。
Jinglecat 2007-08-13
  • 打赏
  • 举报
回复
模板列,似乎不需要显示对 html 进行 encode
Jinglecat 2007-08-13
  • 打赏
  • 举报
回复
try ->

<asp:Label ID="place" runat="server" Text='<%# Eval("单位","<script>document.write(limitStr('{0}',24,true))</" + "script>") %>' > </asp:Label>
sworddx 2007-08-13
  • 打赏
  • 举报
回复
to BearRui(AK-47):
事情不是这样。如果我改为:
<asp:TemplateField HeaderText="详情">
<ItemTemplate>
<asp:Label ID="place" runat="server" Text='<%#Bind("单位","<script>document.write(limitStr({0},24,true));</script>")%>'></asp:Label>
</ItemTemplate>
<ItemStyle Width="100px" />
</asp:TemplateField>

那么这句是可以执行的,只不过{0}没有被引号括起来,致使JS将其认成一个对象,因此报出对象不存在的错误。

用这个方法将一段脚本赋值给一个Label的Text属性,在生成的客户端页面会原封不动的保留,依然可以执行。
cpp2017 2007-08-13
  • 打赏
  • 举报
回复
相当于脚本嵌套,不能识别,导致异常,这也可能是它的bug
cpp2017 2007-08-13
  • 打赏
  • 举报
回复
与函数本身没有关系。应该是asp.net解析的问题。
sworddx 2007-08-13
  • 打赏
  • 举报
回复
to hy_lihuan(罗嗦 我想早恋,可是已经晚了):

这个JS函数已经经过调试完全无误而且逻辑简单;前台在这里涉及到的也仅仅是FormatString的问题,基本没有调试的余地。
BearRui 2007-08-13
  • 打赏
  • 举报
回复
不在后台做是因为前台方便(=.=),而且如果逻辑是正确的,前后台的区别不应很大是吧?
----------------------
但是前台代码不能绑定JS,而且JS也不能用在text或者value属性中,所以你的想法是不行的。

只能你用代码执行1个JS函数去改变控件的value属性,而不能把JS函数写在value或text属性中让它自己执行,JS放在text它执行不了
hy_lihuan 2007-08-13
  • 打赏
  • 举报
回复
前台方便?那出错了你怎么调试?能够后台去编写程序的尽量不要放到前台来,因为这样的逻辑性比较强!
BearRui 2007-08-13
  • 打赏
  • 举报
回复
在后台写处理的方法
.cs文件代码:

public string limitStr(string text,int length)
{
return text.SubString(0,length) + "...";
}
<asp:TemplateField HeaderText="详情">
<ItemTemplate>
<asp:Label ID="place" runat="server" Text='<%# limitStr(Bind("单位").ToString(),24)%>'></asp:Label>
</ItemTemplate>
<ItemStyle Width="100px" />
</asp:TemplateField>
加载更多回复(5)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧