2010-09-30 22 views
20

Tôi đang viết các điều khiển ASP.NET Server khác nhau và tôi cần xóa các thẻ bọc phần điều khiển theo mặc định. Tôi biết rằng bạn có thể thay đổi thẻ thành một thẻ khác (như trong câu hỏi này, How Do I Change the render behavior of my custom control from being a span) nhưng làm cách nào bạn có thể ngăn chặn thẻ?Ngăn chặn các thẻ <span> cho điều khiển máy chủ ASP.NET

Tôi đang kế thừa từ WebControl (cũng có thể kế thừa từ CompositeControl).

tôi thường nhận được:

<span>Control output</span> 

tôi cần:

Control output 

Tôi trọng RenderContents (đầu ra HtmlTextWriter) và CreateChildControls() phương pháp (qua điều khiển khác nhau). Nhu cầu trước mắt của tôi là giải quyết vấn đề bằng cách sử dụng phương thức RenderContents (HtmlTextWriter output).

Trả lời

37

Điều này thì sao?

public override void RenderBeginTag(HtmlTextWriter writer) 
    { 
     writer.Write(""); 
    } 

    public override void RenderEndTag(HtmlTextWriter writer) 
    { 
     writer.Write(""); 
    } 
+0

Quá rõ ràng! Cảm ơn bạn đã giúp đỡ. –

+2

Giải pháp Brilliant :) Tôi thực sự đã sử dụng một phương thức trống cho cả hai và chỉ cần đặt một dòng chú thích giải thích lý do tại sao chúng ở đó. Không chắc chắn nếu đó là bất kỳ khác nhau hơn của bạn, nhưng có nó viết một chuỗi trống có vẻ không cần thiết. – William

+0

Điều này đã giúp tôi rất nhiều - đã phải đọc rất nhiều 'lời khuyên hay', trước khi tôi tìm ra giải pháp hoàn hảo của bạn.Sẽ cung cấp cho bạn nhiều hơn một upvote nếu có thể * g * –

3

Một cách thanh lịch hơn để làm điều này là sử dụng contrustor của WebControl (Theo mặc định này được gọi với HtmlTextWriterTag.Span)

public MyWebControl() : base(HtmlTextWriterTag.Div){} 

và ghi đè phương pháp RenderBeginTag để thêm thuộc tính tuỳ chỉnh hoặc các nội dung khác:

public override void RenderBeginTag(HtmlTextWriter writer) 
    { 
     writer.AddAttribute("class", "SomeClassName"); 
     base.RenderBeginTag(writer); 
    } 
+0

Điều này không giải quyết được vấn đề. Trong khi điều này sẽ cho phép bạn thay đổi span thành một phần tử khác, chẳng hạn như div được đưa ra trong ví dụ của bạn, nó không cho phép bạn loại bỏ hoàn toàn phần tử bên ngoài, như được yêu cầu. Bạn có thể chuyển vào 'HtmlTextWriterTag.Unknown' hoặc một chuỗi rỗng để gọi đến' base() ', nhưng trong khi đó loại bỏ tên của phần tử, các dấu ngoặc nhọn cho phần tử vẫn được giữ lại, vì vậy bạn kết thúc với phần tử không hợp lệ đánh dấu: '<>'. – Elezar

1

Tôi đã gặp sự cố tương tự. Trong trường hợp của tôi, tôi đã được trọng các phương pháp:

protected override void OnPreRender(EventArgs e) 
    { /* Insert the control's stylesheet on the page */ } 

protected override void RenderContents(HtmlTextWriter output) 
     { /* Control rendering here, <span> tag will show up */ } 

Để ngăn chặn điều này, tôi chỉ đơn giản là thay thế các override RenderContents như sau:

protected override void Render(HtmlTextWriter output) 
     { /* Control rendering, no <span> tag */ } 

Hope this helps.

+1

Sử dụng Render thay vì RenderContents hoạt động cho tôi. Bằng cách này, RenderBeginTag/RenderEndTag không bao giờ được gọi là – Trent

0

Tôi không nghĩ câu trả lời được chấp nhận là hoàn toàn cần thiết. Tôi có thể sai, nhưng làm cho phương pháp gọi cả ba:

  • RenderBeginTag
  • RenderContents
  • RenderEndTag

Vì vậy, bạn nên có thể chỉ cần ghi đè lên làm và tự gọi RenderContents:

protected override void Render(HtmlTextWriter writer) 
{ 
    this.RenderContents(writer); 
} 

Bất kỳ ai? Có lẽ tôi đang thiếu một cái gì đó. Tôi biết chủ đề này là cũ nhưng tôi chạy vào này gần đây mà ở trên là giải pháp của tôi.

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