【问题标题】:asp.net (4) listview gives me troubles with generating id'sasp.net (4) listview 给我生成 id 的麻烦
【发布时间】:2011-01-10 14:09:51
【问题描述】:

我在一个 asp.net 列表视图中,在 itemtemplate 中。

<asp:ListView runat="server" ClientIDMode="Predictable" ClientIDRowSuffix="Texttranslations_key"ID="lvwTextitems">

这是我在 itemtemplate 中的代码:

<span runat="server" onclick="openDiv('<%= EditItemDiv.ClientID%>')" style="width: 450px;"><%# Eval("Translation")%></span>
<asp:panel  runat="server" id="EditItemDiv" style="display:none">
<asp:TextBox runat="server" ID = "EditItemArea" TextMode ="MultiLine" Rows="12" Columns="50" Text="<%# Eval("Translation")%>">
</asp:TextBox>

现在我有两个问题。 首先是跨度:我想要函数 openDiv() 中的 asp:panel 的 clientID,所以我可以创建一些显示隐藏功能。 但是,我得到了这个结果:

<span onclick="openDiv(&#39;&lt;%= EditItemDiv.ClientID%>&#39;)" style="width: 450px;">

我的代码不是代码,而是纯文本,我不知道为什么?

其次,这一行给我一个运行时错误(服务器标签格式不正确):

<asp:TextBox runat="server" ID = "EditItemArea" TextMode ="MultiLine" Rows="12" Columns="50" Text="<%# Eval("Translation")%>">

有人可以帮帮我吗?

ps 起初我使用这段代码来生成 id 的:“myid" 但这也没有锻炼......

ps 我在使用 Eval 和 时总是遇到麻烦,所以这可能是一些愚蠢的事情(我希望)

【问题讨论】:

  • 您的 Eval 格式不正确的问题是由于您使用双引号将 Eval 和 Eval 中的项目名称包装起来。这会起作用: Text='' 请注意,我使用单引号将 Eval 包裹起来,同时将双引号保留在里面

标签: asp.net listview asp.net-4.0


【解决方案1】:

对于第一部分,您肯定需要使用绑定表达式:

<%# EditItemDiv.ClientID %>

scriptlet 将没有每个项目的上下文。我假设您是在“解释”您说您尝试过的语法,那么以前什么不起作用?

“服务器标签格式不正确”是因为您试图在双引号内使用双引号。将外部改为单引号:

Text='<%# Eval("Translation")%>'>

基本上,您不能嵌套类似的引用类型。内联脚本通常会要求您使用双引号,因为单引号在 c# 中具有不同的含义,但是您可以使用双引号或单引号来引用标记参数。结果是,如果您需要内联脚本,请使用单引号来包装标记参数,这样您就可以在其中使用双引号。

如果您在输出中需要更多单引号,例如要呈现 javascript 参数,只需使用 &amp;#39;。如果要呈现双引号,也可以使用 &amp;#34;

OnClientClick='openDiv(&#39;EditItem(<%# Eval("something") %>&#39;);'

【讨论】:

  • ,但我已经用引号/双引号,谢谢!我认为问题在于在 onclick 事件中我需要 3 种类型的引号:“onclick= openDiv('EditItem')”因为我需要在 onclick 之前、EditItem 之前和在 eval 语句中
  • 您的代码 sn-p 不可见,请将其放在左引号中以显示在评论中。
  • 听起来你明白了......你不能使用与其中的包装器相同的引号类型。因此,如果您需要将 js 函数的引号放在 eval 参数中,请使用单引号来包装事件,然后为 eval 使用双引号,然后是 '对于 JS 中的更多单引号,例如onclick='openDiv(&amp;#39;EditItem(&lt;%# Eval("something") %&gt;&amp;#39;);'
【解决方案2】:

正如我的评论和 jamietre 所说,要解决绑定问题,您需要更改以下代码:

Text="<%# Eval("Translation")%>"

Text='<%# Eval("Translation")%>'

至于 span 的 onclick 问题,如果您只删除 runat="server" 部分,它应该可以正常工作。我不知道为什么,但似乎添加它会导致控件对 onclick 属性进行编码。

如果您需要跨度上的 runat="server",那么我会尝试寻找另一种解决方案,但不能保证。

【讨论】:

  • “我不知道为什么”,但那是 ASP.NET .aspx 模型的全部意义所在。如果你想使用 runat=server and onclick 然后让 onclick 成为 onclientclick ... asp.net 服务器控件没有用于 .aspx 解析器的 GUI 元素(除非你给它们一个)用于将 onclick 绑定到。
  • 你之前和之后是一样的......只是说'。
  • @jamietre 修复了它。感谢您引起我的注意
  • @drachenstern 你并不完全正确。首先,向服务器控件添加 onclick 会将该属性添加到服务器发回的最终 html 中,并且其中的 javascript 将起作用。其次,问题在于 ASP.Net 服务器控件不允许使用上述表达式语法来设置属性值;甚至 OnClientClick 也不接受只有少数控件具有的语法。我不明白的是为什么它在设置属性值之前不评估表达式,就像使用数据绑定 (#) 和资源 ($) 表达式一样。
  • 但这不是您在实际答案中所说的。在我看来,您的评论和回答说的正好相反。
猜你喜欢
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2012-05-03
  • 2017-08-16
相关资源
最近更新 更多