2008-10-23 32 views
5

Tôi đang sử dụng ASP.NET 3.5 SP1 System.Web.Routing với WebForms cổ điển, như mô tả trong http://chriscavanagh.wordpress.com/2008/04/25/systemwebrouting-with-webforms-sample/Postback không làm việc với ASP.NET Routing (Validation của viewstate MAC thất bại)

Tất cả hoạt động tốt , Tôi có url SEO tùy chỉnh và thậm chí cả công việc postback. Nhưng có trường hợp postback luôn bị lỗi và tôi nhận được:

Xác nhận MAC của ViewState không thành công. Nếu ứng dụng này được lưu trữ bởi một Web Farm hoặc cluster, hãy đảm bảo rằng cấu hình chỉ định cùng một thuật toán validationKey và validation. AutoGenerate không thể được sử dụng trong một cụm.

Dưới đây là kịch bản để tạo lại lỗi:

  1. Tạo một MyPage.aspx Webform tiêu chuẩn với một nút
  2. Tạo Route rằng bản đồ "a/b/{id}" thành "~ /mypage.aspx "
  3. Khi bạn thực thi trang web, bạn có thể điều hướng http://localhost:XXXX/a/b/something trang hoạt động. Nhưng khi bạn nhấn nút bạn nhận được lỗi. Lỗi doen't xảy ra khi Route chỉ là "a/{id}".

Dường như có liên quan đến số lượng đường dẫn phụ trong url. Nếu có ít nhất 2 đường dẫn con thì xác nhận hợp lệ khung nhìn không thành công.

Bạn gặp lỗi ngay cả với EnableViewStateMac = "false".

Bất kỳ ý tưởng nào? Nó là một lỗi?

Cảm ơn

Trả lời

-2

Bạn đang sử dụng safari làm trình duyệt? nếu vậy thì điều này có thể sẽ là một vấn đề với một phao lớn. Loại bỏ phao và mọi thứ sẽ hoạt động tốt.

+0

nếu điều này đúng và chỉ về safari, sẽ tốt nếu có liên kết tham chiếu. – DrydenMaker

0

tôi đã cùng một vấn đề này, tôi đã có một số giả mạo

<form></form> 

Tags, một lần tôi gỡ bỏ chúng từ trang của tôi lỗi không còn nảy ra.

1

Tôi cũng tìm thấy lỗi này trong phiên bản beta asp.net mvc. Nó có thể được tái tạo rất nhiều. Sau khi tạo ứng dụng asp.net mvc bằng cách sử dụng mẫu mặc định, thêm điều khiển asp: button vào trang home.aspx trong dạng xem thiết kế, nhấn f5, trang chủ được hiển thị chính xác. nhấp vào nút, lỗi này sẽ hiển thị. Sau khi một số gỡ lỗi vào mã nguồn mvc, tôi thấy nó được gây ra bởi các ViewUserControl trong trang site.master, chỉ cần bình luận các <% Html.RenderPartial ("LoginUserControl"); %>, sau đó sự kiện nhấp chuột có thể được xử lý đúng cách.

Tôi cũng nhận thấy rằng cài đặt như enableViewStateMac = "false" enableEventValidation = "false" viewStateEncryptionMode = "Never" không hữu ích.

Trong mã nguồn MVC phần sau xử lý các ViewUserControl render

công virtual void RenderView (ViewContext viewContext) {

// TODO: Remove this hack. Without it, the browser appears to always load cached output 
viewContext.HttpContext.Response.Cache.SetExpires(DateTime.Now); 
**ViewUserControlContainerPage containerPage = new ViewUserControlContainerPage(this);** 
// Tracing requires Page IDs to be unique. 
ID = Guid.NewGuid().ToString(); 
containerPage.RenderView(viewContext); 

}

tin lớp kín ViewUserControlContainerPage: ViewPage {

public ViewUserControlContainerPage(ViewUserControl userControl) { 
    Controls.Add(userControl); 
} 

}

ViewUserControl luôn hiển thị trong trang vùng chứa mới được tạo, trang này sẽ không chọn cài đặt của bạn. Trong thực tế, nếu bước tới phần này, hãy thay đổi thủ công container.enableViewStateMac thành false, không trợ giúp để giết lỗi. Vì vậy, cách duy nhất để giải quyết nó là yêu cầu Microsoft thay đổi mã mvc.

8

tôi làm việc xung quanh điều này bằng cách điều khiển người dùng quan điểm của tôi kế thừa từ lớp này thay vì ViewUserControl<T> (nó loại một bản vá cho RenderView). Nó đã làm các trick cho tôi, hy vọng nó hoạt động cho bạn quá.

public class ViewUserControlWithoutViewState<T> : ViewUserControl<T> where T : class { 
    protected override void LoadViewState(object savedState) {} 

    protected override object SaveControlState() { 
     return null; 
    } 

    protected override void LoadControlState(object savedState) {} 

    protected override object SaveViewState() { 
     return null; 
    } 

    /// <summary> 
    /// extracted from System.Web.Mvc.ViewUserControl 
    /// </summary> 
    /// <param name="viewContext"></param> 
    public override void RenderView(ViewContext viewContext) { 
     viewContext.HttpContext.Response.Cache.SetExpires(DateTime.Now); 
     var containerPage = new ViewUserControlContainerPage(this); 
     ID = Guid.NewGuid().ToString(); 
     RenderViewAndRestoreContentType(containerPage, viewContext); 
    } 

    /// <summary> 
    /// extracted from System.Web.Mvc.ViewUserControl 
    /// </summary> 
    /// <param name="containerPage"></param> 
    /// <param name="viewContext"></param> 
    public static void RenderViewAndRestoreContentType(ViewPage containerPage, ViewContext viewContext) { 
     string contentType = viewContext.HttpContext.Response.ContentType; 
     containerPage.RenderView(viewContext); 
     viewContext.HttpContext.Response.ContentType = contentType; 
    } 

    /// <summary> 
    /// Extracted from System.Web.Mvc.ViewUserControl+ViewUserControlContainerPage 
    /// </summary> 
    private sealed class ViewUserControlContainerPage : ViewPage { 
     // Methods 
     public ViewUserControlContainerPage(ViewUserControl userControl) { 
      Controls.Add(userControl); 
      EnableViewState = false; 
     } 

     protected override object LoadPageStateFromPersistenceMedium() { 
      return null; 
     } 

     protected override void SavePageStateToPersistenceMedium(object state) {} 
    } 
} 

I blogged about this một số thời gian trước đây.

+0

+1 Tuyệt vời! Đã lưu tôi từ đây: http://stackoverflow.com/questions/1278258/asp-net-mvc-webform-hybrid – orip

0

Chỉ cần cố gắng xóa cookie trên máy cục bộ của bạn. Đã có cùng một vấn đề và điều này đã giúp.

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