2011-01-26 28 views
5

Thực hiện kịch bản sau đây. Tôi có nhiều trang ASPX. Đăng nhập, đăng xuất, chính, tin nhắn, vv ... Tất cả họ đều được thừa hưởng từ System.Web.UI.Page tất nhiên. Đối với tất cả các trang, tôi muốn ghi đè phương thức Render từ lớp Page. Tôi có thể dễ dàng sao chép và dán cùng một mã vào mỗi trang như vậy:Cách ghi đè cùng một chức năng trên nhiều trang ASP.NET (Render Function)

protected override void Render(HtmlTextWriter writer) 
{ 
    //Code Logic Here 
} 

Nhưng nếu tôi có nhiều trang, hãy bảo đảm mã trong mỗi trang có thể mất nhiều thời gian và dễ bị lỗi.

Điều đó khiến tôi suy nghĩ một chút và tôi nghĩ không sao cho phép thử điều này ... ghi đè lên hàm trong mỗi trang nhưng gọi hàm tĩnh. Bằng cách đó, việc thay đổi chức năng tĩnh sẽ dẫn đến thay đổi cho mỗi trang. Mà làm việc tốt ... Nhưng nó không thực sự tốt đẹp và sạch sẽ, phải ghi đè như thế trên mỗi trang duy nhất. Có ai có ý tưởng hay suy nghĩ về cái này không? Có lẽ một cái gì đó đơn giản tôi nhìn ra? Cảm ơn

EDIT: Một số trang sử dụng lớp System.Web.UI.Page và một số trang được kế thừa từ một lớp khác có tên là ModifiedPage thừa hưởng và ghi đè các chức năng khác của lớp System.Web.UI.Page. Vì vậy, nó không đơn giản như kế thừa tất cả các trang từ một lớp.

EDIT2: Tất cả các trang cần hành vi này, một số đã xuất phát từ một lớp khác và tôi không thể thay đổi cách triển khai hoặc phân cấp thừa kế của lớp khác.

+3

sử dụng lớp cơ sở được thừa kế từ System.Web.UI.Trang và sau đó sử dụng nó cho tất cả các trang của bạn –

+0

EDIT: Một số trang sử dụng lớp System.Web.UI.Page và một số trang kế thừa từ một lớp khác có tên là ModifiedPage thừa kế và ghi đè các hàm khác của lớp System.Web.UI.Page. Vì vậy, nó không đơn giản như kế thừa tất cả các trang từ một lớp. –

+1

xem câu trả lời đã sửa đổi của tôi. –

Trả lời

12

Thay vì kế thừa từ System.Web.UI.Page, có tất cả chúng kế thừa từ MyProject.MyBasePage mà kế thừa từ trang:

public abstract class MyBasePage : System.Web.UI.Page 
{ 
    protected override void Render(HtmlTextWriter writer) 
    { 
     //Code Logic Here 
    } 
} 

và ...

public partial class MySpecificPage : MyBasePage 
{ 
} 

Sửa

Làm rõ thêm vào câu hỏi bây giờ chỉ ra các câu đố thực sự - các trang mà tất cả cần phổ biến này Re nder logic có đường dẫn thừa kế khác nhau. Đó là khó khăn hơn trong C#, và bạn sẽ không thể tránh được ít nhất một chút mã nguồn nước dự phòng. Có rất nhiều cách khác nhau để xử lý việc này - đây là một cách tiếp cận mà tôi đã thực hiện trong quá khứ:

1) Tạo giao diện cho chức năng phổ biến này. Ví dụ, IOverrideRender:

public interface IOverrideRender 
{ 
    void Register(OverrideRender render); 
} 

public delegate void OverrideRender(HtmlTextWriter writer, Action<HtmlTextWriter> original); 

2) Mỗi ​​trang mà cần chức năng này được giao diện và dây nó như vậy:

public partial class MyPage : Page, IOverrideRender 
{ 
    void IOverrideRender.Register(OverrideRender render) 
    { 
     this.overrideRender = render; 
    } 

    private OverrideRender overrideRender; 

    protected override void Render(HtmlTextWriter writer) 
    { 
     if(overrideRender != nul) 
     { 
      overrideRender(writer, base.Render); 
     } 
     else 
     { 
      base.Render(writer); 
     } 
    } 
} 

3) Trong một HttpModule, kiểm tra xem nếu xử lý là IOverrideRender và nếu có, hãy chuyển phương thức hiển thị tùy chỉnh của bạn:

public class OverrideRenderModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.PreRequestHandlerExecute += this.HandlePreRequestExecute; 
    } 

    private void HandlePreRequestExecute(object sender, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)sender; 
     IOverrideRender overridable = app.Context.CurrentHandler as IOverrideRender; 
     if(overridable != null) 
     { 
      overridable.Register(
       (writer, original) => { 
        writer.Write("Hello world"); //custom write 
        original(writer); //calls base.Render 
      }); 
     } 
    } 
} 
+0

thx Rex ... lol xấu xí của nó, nhưng tôi biết một số giao diện sẽ là cần thiết. hy vọng nó hoạt động –

1

Bạn nên tạo BasePage kế thừa từ System.Web.UI.Page. Trong BasePage, bạn có thể ghi đè lên phương thức Render và sau đó có tất cả các trang của bạn kế thừa từ BasePage.

1

Thêm một cấp độ trong hệ thống cấp bậc của bạn và thực hiện một BasePage và làm override của bạn ở đó, sau đó kế thừa tất cả các trang khác từ BasePage

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