2009-08-14 8 views
3

Nous (moi et mon équipe) avons une application ASP.NET MVC et nous intégrons une ou deux pages Web Forms. Nous essayons de réutiliser la page principale de notre partie MVC de l'application dans la partie WebForms. Nous avons trouvé un moyen de rendre une vue partielle MVC dans les formulaires Web, ce qui fonctionne très bien, nous essayons de faire une publication, ce qui est la raison pour laquelle nous utilisons un WebForm.ASP.NET MVC, Webform hybride

L'erreur:

Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.

Le code pour rendre la vue partielle d'un WebForm (credited to "How to include a partial view inside a webform"):

public static class WebFormMVCUtil 
{ 
    public static void RenderPartial(string partialName, object model) 
    { 
     //get a wrapper for the legacy WebForm context 
     var httpCtx = new HttpContextWrapper(System.Web.HttpContext.Current); 

     //create a mock route that points to the empty controller 
     var rt = new RouteData(); 
     rt.Values.Add("controller", "WebFormController"); 

     //create a controller context for the route and http context 
     var ctx = new ControllerContext(
      new RequestContext(httpCtx, rt), new WebFormController()); 

     //find the partial view using the viewengine 
     var view = ViewEngines.Engines.FindPartialView(ctx, partialName).View; 

     //create a view context and assign the model 
     var vctx = new ViewContext(ctx, view, 
      new ViewDataDictionary { Model = model }, 
      new TempDataDictionary()); 

     //ERROR OCCURS ON THIS LINE 
     view.Render(vctx, System.Web.HttpContext.Current.Response.Output); 
    } 
} 

Ma seule expérience avec cette erreur dans le contexte d'une ferme Web, ce qui est l'affaire. De plus, je comprends que la clé machine est utilisée pour déchiffrer ViewState.

Toute information sur la façon de diagnostiquer ce problème serait appréciée.

Un travail autour de: Jusqu'à présent, le travail autour est de déplacer le contenu d'en-tête à un PartialView, utilisez un appel AJAX pour appeler une page avec juste la vue partielle des WebForms, puis en utilisant la Vue partielle directement sur les vues MVC. En outre, nous sommes toujours en mesure de partager des parties non spécifiques à la technologie de la page principale, c'est-à-dire tout ce qui n'est pas spécifique à MVC. Encore là, ce n'est pas une solution idéale, une solution côté serveur est toujours souhaitée.

En outre, ce solutino a des problèmes lorsque vous travaillez avec des contrôles qui ont des contrôles plus sophistiqués, en utilisant JavaScript, en particulier un script généré de manière dynamique tel qu'il est utilisé par les contrôles tiers. Essayez de désactiver ViewState sur toutes les pages MVC de manière explicite.

+1

Je suis à la recherche d'une solution à cela aussi; il semble que vous utilisiez également la même technique dans l'ID de question SO # 702746. N'importe qui?? –

+0

@Kurt Edit fait pour donner crédit –

+0

Dupliquer: http://stackoverflow.com/questions/230014 –

Répondre

0

1

Voir Mauricio Scheffer's answer. Avoir les vues partielles sous-classer sa classe ViewUserControlWithoutViewState<T> au lieu de ViewUserControl<T> a résolu cela pour moi.

0

Pourquoi ne pas désactiver la validation MAC?

Voici un lien

http://msdn.microsoft.com/en-us/library/ydy4x04a.aspx

EnableViewStateMac = false

Vous pouvez ignorer les

Security Note

This attribute should never be set to false in a production Web site.

depuis votre site est un site MVC et l'état d'affichage est pas vraiment utilisé.

Questions connexes