2008-10-23 11 views
5

estoy usando el ASP.NET System.Web.Routing 3.5 SP1 con WebForms clásicos, como se describe en http://chriscavanagh.wordpress.com/2008/04/25/systemwebrouting-with-webforms-sample/devolución de datos no funciona con ASP.NET enrutamiento (Validación del estado de vista MAC no)

Todo funciona bien , Tengo URL de SEO personalizadas e incluso trabajos de postback. Pero hay un caso en el que la devolución de datos siempre falla y obtengo un:

La validación de viewstate MAC falló. Si esta aplicación está alojada en una Web Farm o clúster, asegúrese de que la configuración especifique la misma validationKey y el mismo algoritmo de validación. AutoGenerate no se puede usar en un clúster.

Aquí está el panorama para reproducir el error:

  1. Crear una MyPage.aspx formulario web estándar con un botón
  2. crear una ruta que asigna "a/b/{id}" a "~ /mypage.aspx "
  3. Cuando ejecuta el sitio, puede navegar http://localhost:XXXX/a/b/something la página funciona. Pero cuando presionas el botón, obtienes el error. El error no ocurre cuando la ruta es simplemente "a/{id}".

Parece estar relacionado con el número de sub-caminos en la url. Si hay al menos 2 subrutas, la validación viewstate falla.

Obtiene el error incluso con EnableViewStateMac = "false".

¿Alguna idea? ¿Es un error?

Gracias

Respuesta

-2

¿Estás utilizando safari como navegador? si es así, probablemente sea un problema con un flotador grande. Quita ese flotador y las cosas funcionarán bien.

+0

si esto es cierto, y sobre safari solamente, sería bueno tener un enlace de referencia. – DrydenMaker

0

tuve este mismo tema, tuve algunos pícaro

<form></form> 

etiquetas, una vez que se les retire de mi página de error ya no se acercó.

1

También encontré este error en asp.net mvc beta. Puede ser muy reproducido. Después de crear la aplicación asp.net mvc usando la plantilla predeterminada, agregue un control de botón asp: a la página home.aspx en la vista de diseño, pulse f5, la página de inicio se muestra correctamente. haga clic en el botón, este error aparecerá. Después de una cierta depuración en el código fuente de mvc, encontré que es causado por ViewUserControl en la página site.master, simplemente comente el <% Html.RenderPartial ("LoginUserControl"); %>, entonces el evento click puede manejarse correctamente.

También encontré que establecer como enableViewStateMac = "false" enableEventValidation = "false" viewStateEncryptionMode = "Nunca" no es útil.

En el código fuente mvc la siguiente sección manejar la ViewUserControl representación

pública RenderView virtual de vacío (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); 

}

privada ViewUserControlContainerPage clase sellada: ViewPage {

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

}

ViewUserControl siempre se procesa en una página de contenedor recién creada, esta página no seleccionará su configuración. De hecho, si paso a esta sección, cambie manualmente el contenedor.enableViewStateMac a falso, ayuda a eliminar el error. Entonces, la única forma de resolverlo es pedirle a Microsoft que cambie el código mvc.

8

trabajé alrededor de esto por tener mi control de usuario vista heredan de esta clase en lugar de ViewUserControl<T> (Es una especie de un parche para RenderView). Me funcionó, espero que también funcione para ti.

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 hace un tiempo.

+0

+1 ¡Impresionante! Me salvó de esto: http://stackoverflow.com/questions/1278258/asp-net-mvc-webform-hybrid – orip

0

Simplemente intente borrar las cookies en su máquina local. Tenía el mismo problema y esto ayudó.

Cuestiones relacionadas