2016-05-03 212 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