2009-05-19 14 views
6

webcontrol A-bên thứ ba tạo ra các mã sau đây để hiển thị bản thân:Sửa sản lượng html ở bên cạnh máy chủ trong ASP.NET

<div id="uwg"> 
    <input type="checkbox" /> 
    <div>blah-blah-blah</div> 
    <input type="checkbox" /> 
</div> 

Có thể thay đổi nó để

<div id="uwg"> 
    <input type="checkbox" disabled checked /> 
    <div>blah-blah-blah</div> 
    <input type="checkbox" disabled checked /> 
</div> 

Khi chúng ta click trên

<asp:CheckBox id="chk_CheckAll" runat="server" AutoPostBack="true" /> 

nằm trên cùng một trang?

Chúng tôi cần làm điều đó ở phía máy chủ (trong ASP.NET).

Điều khiển của bên thứ ba đó không cung cấp giao diện cho điều này, do đó, khả năng duy nhất là làm việc với đầu ra html. Tôi nên xử lý sự kiện trang nào (nếu có)? Ngoài ra, có một số tương đương với mô hình DOM, hoặc tôi cần phải làm việc với đầu ra như chuỗi?

Trả lời

20

Khi hộp kiểm không được chạy ở máy chủ hoặc được đóng gói bên trong kiểm soát, chúng ta có thể sử dụng các phương pháp sau đây:

protected override void Render(HtmlTextWriter writer) 
{ 
    // setup a TextWriter to capture the markup 
    TextWriter tw = new StringWriter(); 
    HtmlTextWriter htw = new HtmlTextWriter(tw); 

    // render the markup into our surrogate TextWriter 
    base.Render(htw); 

    // get the captured markup as a string 
    string pageSource = tw.ToString(); 

    string enabledUnchecked = "<input type=\"checkbox\" />"; 
    string disabledChecked = "<input type=\"checkbox\" disabled checked />"; 

    // TODO: need replacing ONLY inside a div with id="uwg" 
    string updatedPageSource = pageSource; 
    if (chk_CheckAll.Checked) 
    { 
     updatedPageSource = Regex.Replace(pageSource, enabledUnchecked, 
       disabledChecked, RegexOptions.IgnoreCase); 
    } 

    // render the markup into the output stream verbatim 
    writer.Write(updatedPageSource); 
} 

Giải pháp được lấy từ here.

+0

Đây là phương pháp cho trang của tôi hoặc cho webcontrol, được kế thừa từ điều khiển của bên thứ ba đó. – Roma

+0

Giải pháp này hoạt động rất tốt trong Điều khiển người dùng của tôi vì nó chỉ ghi lại đầu ra cho điều khiển riêng lẻ mà bạn đang dùng cho những người không thể biết được mình đang làm gì, chức năng này sẽ ghi đè mặc định của biểu mẫu (hoặc trong trường hợp của tôi) Render chức năng và thay thế một số HTML trong nó với HTML khác nhau. – Jrud

4

Thừa kế và tìm các điều khiển trong cây điều khiển và đặt thuộc tính cho phù hợp.

protected override void OnPreRender(EventArgs e) 
{ 
     base.OnPreRender(e); 
     (this.Controls[6] as CheckBox).Disabled = true; 
} 

Rõ ràng điều này là dễ vỡ nếu điều khiển sẽ sửa đổi đầu ra tùy thuộc vào các thuộc tính khác hoặc nếu bạn nâng cấp thư viện; nhưng nếu bạn cần một cách giải quyết, điều này sẽ làm việc.

+0

Tuyệt vời! Và, tôi nghĩ, tôi có thể nhận được div đầu tiên bởi id của nó (nó có id, mặc dù tôi đã không hiển thị nó), và tìm các phần tử con của nó bằng cách gõ theo cách tương tự như được hiển thị ở trên? – Roma

+0

Có, bạn có thể sử dụng FindControl ("id") –

+0

Cảm ơn bạn. Và tôi có thể chỉ thực hiện Page.OnPreRender (EventArgs e) cho trang hiện tại của tôi, mà không kế thừa? – Roma

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