asp.net-mvc - net - web forms c#
La postback no funciona con el enrutamiento ASP.NET(la validación de viewstate MAC falló) (6)
Estoy usando ASP.NET 3.5 SP1 System.Web.Routing con WebForms clásicos, como se describe en http://chriscavanagh.wordpress.com/2008/04/25/systemwebrouting-with-webforms-sample/
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 una:
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 escenario para reproducir el error:
- Cree un formulario web estándar mypage.aspx con un botón
- Crea una ruta que mapea "a / b / {id}" a "~ / mypage.aspx"
- Cuando ejecuta el sitio, puede navegar por http: // localhost: XXXX / a / b / something donde funciona la página. Pero cuando presionas el botón, obtienes el error. El error no ocurre cuando la ruta es simplemente "a / {id}".
Parece estar relacionado con la cantidad de subrutas en la url. Si hay al menos 2 subrutas, la validación viewstate falla.
Obtiene el error incluso con EnableViewStateMac = "false".
¿Algunas ideas? ¿Es un error?
Gracias
¿Estás usando safari como navegador? si es así, probablemente sea un problema con un flotador grande. Quita ese flotador y las cosas funcionarán bien.
Tuve este mismo problema, tuve algunos pícaros
<form></form>
Etiquetas, una vez que los quité de mi página ya no apareció el error.
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, descubrí 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 = "Never" no es útil.
En el código fuente de mvc, la siguiente sección maneja la representación ViewUserControl
vacío virtual público 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);
}
clase privada cerrada ViewUserControlContainerPage: ViewPage {
public ViewUserControlContainerPage(ViewUserControl userControl) {
Controls.Add(userControl);
}
}
el 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.
Este problema en Microsoft Connect:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=393619
He ViewUserControl<T>
esto teniendo mi control de usuario de vista heredado de esta clase en lugar de ViewUserControl<T>
(es como 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) {}
}
}
Publiqué sobre esto hace algún tiempo.
Intente borrar las cookies en su máquina local. Tenía el mismo problema y esto ayudó.