2012-11-21 26 views
6

Tôi đang thêm một số nội dung vào một trang web cụ thể từ mã phía sau. Khi tôi muốn thêm một break sau khi một số văn bản, tôi cố gắng làm điều đó theo cách này:Hiển thị HtmlGenericControl ("br") hai lần

pDoc.Controls.Add(New Label With {.Text = "whatever"}) 
pDoc.Controls.Add(New HtmlGenericControl("br")) 

, nơi pDoc là Panel trong đó tôi thêm nội dung. Nhưng nó thêm hai thẻ br vào HTML cuối cùng.

Tôi đã tránh hành vi này theo cách này:

pDoc.Controls.Add(New Label With {.Text = "whatever" & "<br />"}) 

Dù sao, tôi cảm thấy rất tò mò và tôi muốn biết tại sao

pDoc.Controls.Add(New HtmlGenericControl("br")) 

là hành động như vậy. Tôi cũng nghĩ rằng cách tiếp cận của tôi không quá lạ mắt.

Kính trọng,

+1

Bạn có chắc chắn nó được render '

'không'

'? – tpeczek

+0

vâng, anh ta đúng là đang hiển thị

Trả lời

5

Sau một số thử nghiệm có vẻ như lý do là HtmlGenericControl không hỗ trợ tự đóng. Về phía máy chủ HtmlGenericControl("br") được xử lý như sau:

<br runat="server"></br> 

Không có </br> thẻ trong HTML, vì vậy trình duyệt cho thấy nó như là có hai <br /> thẻ. Đẹp lối thoát của việc này là để tạo ra HtmlGenericSelfCloseControl như thế này (xin lỗi cho mã C# nhưng bạn nên không có vấn đề với rewritting này trong VB.NET):

public class HtmlGenericSelfCloseControl : HtmlGenericControl 
{ 
    public HtmlGenericSelfCloseControl() 
     : base() 
    { 
    } 

    public HtmlGenericSelfCloseControl(string tag) 
     : base(tag) 
    { 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     writer.Write(HtmlTextWriter.TagLeftChar + this.TagName); 
     Attributes.Render(writer); 
     writer.Write(HtmlTextWriter.SelfClosingTagEnd); 
    } 

    public override ControlCollection Controls 
    { 
     get { throw new Exception("Self closing tag can't have child controls"); } 
    } 

    public override string InnerHtml 
    { 
     get { return String.Empty; } 
     set { throw new Exception("Self closing tag can't have inner content"); } 
    } 

    public override string InnerText 
    { 
     get { return String.Empty; } 
     set { throw new Exception("Self closing tag can't have inner text"); } 
    } 
} 

Và sử dụng nó thay vì:

pDoc.Controls.Add(New Label With {.Text = "whatever"}) 
pDoc.Controls.Add(New HtmlGenericSelfCloseControl("br")) 

như một sự thay thế đơn giản hơn (nếu bạn có tham chiếu đến Page), bạn có thể thử sử dụng Page.ParseControl:

pDoc.Controls.Add(New Label With {.Text = "whatever"}) 
pDoc.Controls.Add(Page.ParseControl("br")) 
+0

Sẽ không dễ dàng hơn khi kế thừa từ 'HtmlControl'? Sau đó, bạn chỉ cần hàm tạo và có thể ghi đè lên 'RenderAttributes' nếu bạn muốn có thẻ tự đóng theo kiểu XHTML. –

+0

@RichardDeeming Hầu hết có lẽ là có, tôi chỉ có đoạn mã này được viết một số thời gian trước đây trong một trong các dự án của tôi và tôi dán nó mà không xem xét cho tái cấu trúc. – tpeczek

+0

Page.ParseControl ("br") không hoạt động đối với tôi. Page.ParseControl ("
") không hoạt động. – JJS

21

Trên thực tế bạn có thể sử dụng;

pDoc.Controls.Add(new LiteralControl("<br/>")); 

Trong khi new HtmlGenericControl("br") thêm hai <br>, điều này sẽ chỉ làm tăng thêm <br/> thẻ để HTML của bạn để bạn chỉ có 1 dòng không gian. Trong bức ảnh này, tôi đã thêm các ngắt đó với khối mã đó.

enter image description here

Cũng câu hỏi tương tự ở đây: Server control behaving oddly

+0

Cảm ơn câu trả lời của bạn. Nó hoạt động tốt.Tôi đang upvoting, nhưng không đánh dấu là câu trả lời đúng do tôi xem xét trước đó cụ thể hơn cho câu hỏi của tôi. – adripanico

Các vấn đề liên quan