2016-05-03 176 views
1

这是ASP.NET 4.0中的错误,还是我错过了明显的东西......?ASP.NET标签删除空间

我与<ItemTemplate>内大致如下的<asp:Repeater> ...

<td><asp:Checkbox runat="server" ID="chkInclude" Checked="true" /></td> 
<td> 
    <asp:Label runat="server" AssociatedControlID="chkInclude"> 
    <%#Container.DataItem.FirstName%> <%#Container.DataItem.Surname%></asp:Label> 
</td> 

这导致了名字和姓氏被渲染没有之间的空间......

<td>JoeBlogs</td> 

有一个简单的解决方案,即串接字符串...

<asp:Label runat="server" AssociatedControlID="chkInclude"> 
    <%#Container.DataItem.FirstName & " " & Container.DataItem.Surname%></asp:Label> 

...但我想知道为什么当使用单独的<%#Container%>元素时,空间被剥离出<asp:Label>。我无法在控件上看到一个明显的属性,表明这可以被覆盖。


作为一个现在删除评论指出的那样,我也可以在元素之间添加&nbsp;作为另一个变通...但如果合适,这将阻止它自动换行。


进一步的调查(由@Andrei提示)显示,...

  • 卸下<asp:Label>导致正确的输出
  • 更换<%#%>块硬文本导致正确的输出
  • <%#%>块之间添加硬文本会产生正确的输出(尽管我明显不想要额外的文本)
  • 更换<asp:Label><span>导致正确的输出

但具有单个空间中的两个块,并且它失败(即之间没有空间)。

我也尝试删除AssociatedControlID但也失败了。

+0

如果多个空格用一个空格代替,这将是由于HTML的呈现方式。但删除单个空间看起来很奇怪。你尝试过简化的东西吗?说,而不是'<%# %>'只是硬编码的东西,看看会发生什么?甚至用span替换Label并再次查看会发生什么? – Andrei

+0

@Andrei - 同意,这很奇怪。删除''完全没问题......用硬文本替换'<%#%>'块就好了......在'<%#%>'块之间添加文本没问题。但是有两个单一空间块,并且失败。我也尝试删除'AssociatedControlID',但也失败了。最后,这并不重要,因为我有一个简单的解决方法,我只是认为这是我做错了,并想检查 – freefaller

+0

没有你做错了什么,但这将是有趣的弄清楚。所以我会尝试的是:1)没有容器:'乔博客'; 2)没有标签控制'<%#容器%><%#容器%>'。你可以检查是否有任何保留空间? – Andrei

回答

2

每当我想了解ASP .Net如何从aspx标记中生成代码时,我会故意创建一个编译错误,然后检查显示完整编译源代码

我这种情况下,你可以写类似

<asp:Label runat="server" AssociatedControlID="chkInclude"> 
    <%#Container.DataItem.FirstName/2%> <%#Container.DataItem.Surname%></asp:Label> 

然后你会看到的ASP.NET如何解析<asp:Label runat="server" AssociatedControlID="chkInclude"></asp:Label>之间有什么。

ASP .Net认为这里有两种令牌:静态字符串数据绑定字符串。它将它们存储在两个不同的数组中,在这种情况下,它们是标签控件的Text属性,或者它呈现Render方法中的html内容。你的问题是ASP。Net不会将两个数据绑定字符串之间的空间视为静态字符串,因此它不会将该空间与静态字符串放在数组中。一旦你在这两个数据绑定字符串之间添加了任何字符,它们就成为一个静态字符串,包括空格。

enter image description here

在此图像中蓝色的标记文本是必然的字符串和他们之间有什么的是静态字符串数据。


这种情况与DataBoundLiteralControl

+1

奇妙 - 很好找到,并很好地解释。这是完全合理的。谢谢 :-) – freefaller