2010-03-04 17 views
6

mới nhất và cách thức lớn nhất đối với di chuyển ViewState để dưới cùng của trangASP.NET: Di chuyển ViewState để dưới cùng của trang

này có thể được thực hiện trong một IHttpHandler có thể được quy định trong là gì web.config để chặn yêu cầu tới "* .aspx"?

<httpHandlers> 
    <add verb="*" path="*.aspx" type="MyApp.OptimizedPageHandler" /> 
<httpHandlers> 

Các tùy chọn khác là điều này có thể được thực hiện trong một IHttpModule, nhưng đó là không như performant, vì nó sẽ chặn tất cả các yêu cầu.

Ngoài ra nó có thể được thực hiện trong một một bắt nguồn từ lớp Trang hoặc MasterPage đẳng cấp, nhưng đây là không phải là mô-đun.

Có bất kỳ hình phạt nào về hiệu suất cho điều này không?

+5

Tôi có thể hỏi lý do bạn muốn chuyển nó xuống cuối trang không? Tôi nghi ngờ bất cứ ai quan tâm đến vẻ bề ngoài HTML của bạn gợi cảm như thế nào :) – Polaris878

+0

@ Polaris878, tôi đồng ý với (+1), nhưng đối với các trang có chế độ xem hài hước, nó sẽ khiến chúng dễ nhìn hơn khi xem nguồn/gỡ lỗi :) – Rob

+6

tìm kiếm trình thu thập dữ liệu quan tâm. – IrishChieftain

Trả lời

1

Sau khi tiến hành một số nghiên cứu, tôi đặt cùng nhau this blog-post.

tôi giải quyết vấn đề này bằng cách tạo ra một HttpModule và áp dụng một đáp ứng Lọc, mà đổi sản lượng trang và di chuyển các ViewState để dưới cùng của biểu mẫu.

public class ViewStateSeoHttpModule : IHttpModule { 
    public void Init(HttpApplication context) { 
     context.BeginRequest += new EventHandler(BeginRequest); 
    } 

    private void BeginRequest(object sender, EventArgs e) { 
     HttpApplication application = sender as HttpApplication; 

     bool isAspNetPageRequest = GetIsAspNetPageRequest(application); 
     if(isAspNetPageRequest) { 
      application.Context.Response.Filter = 
       new ViewStateSeoFilter(application.Context.Response.Filter); 
     } 
    } 

    private bool GetIsAspNetPageRequest(HttpApplication application) { 
     bool isAspNetPageRequest = application.Context.Handler is System.Web.UI.Page; 
     return isAspNetPageRequest; 
    } 
    // [...] 
+2

đó là khá lạc quan ... những gì về url mở rộng hoặc nếu bạn đang sử dụng cái gì khác hơn aspx? Không, thay vào đó bạn nên xem liệu trình xử lý hiện tại của bạn có phải là System.Web.UI.Page hay không. bool isAspNetPageRequest = application.Context.Handler là System.Web.UI.Page; –

+0

Đầu vào rất tốt @BurningIce –

2

Bạn có thể kiểm soát cách thức và nơi dữ liệu ViewState được tải và lưu bằng cách tạo triển khai tùy chỉnh của lớp PageStatePersister. Sau đó, tạo lớp cơ sở cho tất cả các trang ASPX của bạn và ghi đè phương thức PageStatePersister để trả lại triển khai tùy chỉnh của bạn. Điều này sau đó có thể chạm vào bất kỳ sự kiện trang nào bạn muốn lưu trữ ViewState theo yêu cầu của bạn.

Tôi đặt câu hỏi liệu nó có đáng giá hay không. Bạn đang lưu trữ một tấn dữ liệu int ông ViewState không cần thiết? Có thể bạn có thể nhận được nhiều lợi ích hơn bằng cách chỉ sử dụng ít hơn ViewState hoặc tắt một số điều khiển thay vì chỉ di chuyển nó đến một vị trí khác trong trang HTML.

0

Mở rộng lớp Trang cung cấp cho bạn quyền kiểm soát nhiều nhất đối với hiển thị trang. Nếu bạn muốn di chuyển ViewState xuống dưới cùng của một trang nhất định, hãy sử dụng lớp cơ sở tùy chỉnh của bạn cho trang đó. Nếu bạn không cần, hãy sử dụng lớp Page.

Rủi ro hiệu suất duy nhất khi bắt nguồn từ lớp Trang là việc bạn triển khai các phương pháp ghi đè. Trừ khi bạn đang làm một cái gì đó đặc biệt không hiệu quả, không nên có bất kỳ hit hiệu suất cảm nhận được.