2010-12-03 26 views
2

J'essaie d'utiliser le Html.AntiForgeryToken dans ASP.NET MVC sous Mono (XSP) et cela ne fonctionne pas. Il jette l'exception suivante. Des idées?ASP.NET MVC: AntiForgeryToken fonctionne-t-il en mono?

System.ArgumentNullException: Argument cannot be null. 
Parameter name: inputString 
    at System.Web.UI.ObjectStateFormatter.Deserialize (System.String inputString) [0x00006] in /home/danipen/Downloads/mono-2.8/mcs/class/System.Web/System.Web.UI/ObjectStateFormatter.cs:131 
    at System.Web.UI.HiddenFieldPageStatePersister.Load() [0x00007] in /home/danipen/Downloads/mono-2.8/mcs/class/System.Web/System.Web.UI/HiddenFieldPageStatePersister.cs:57 
    at System.Web.UI.Page.LoadPageStateFromPersistenceMedium() [0x0000f] in /home/danipen/Downloads/mono-2.8/mcs/class/System.Web/System.Web.UI/Page.cs:1763 
    at System.Web.UI.Page.LoadPageViewState() [0x00000] in /home/danipen/Downloads/mono-2.8/mcs/class/System.Web/System.Web.UI/Page.cs:1769 
    at System.Web.UI.Page.RestorePageState() [0x00051] in /home/danipen/Downloads/mono-2.8/mcs/class/System.Web/System.Web.UI/Page.cs:1454 
    at System.Web.UI.Page.InternalProcessRequest() [0x001b9] in /home/danipen/Downloads/mono-2.8/mcs/class/System.Web/System.Web.UI/Page.cs:1433 
    at System.Web.UI.Page.ProcessRequest (System.Web.HttpContext context) [0x0005b] in /home/danipen/Downloads/mono-2.8/mcs/class/System.Web/System.Web.UI/Page.cs:1261 

Connaissez-vous une autre façon de mettre en œuvre cela?

Merci à l'avance.

Modifier: Ceci est mon code de vue (c'est une vue partielle). Si je supprime la ligne <%= Html.AntiForgeryToken() %> tout fonctionne très bien, dans d'autres cas, il lève l'exception décrite ci-dessus.

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Codice.Web.Client.Comment>" %> 

<div class="comment" style="background-color: #009ACF"> 
<div class="comment-meta"> 
    <p class="comment-author"> 
    <span class="avatarimage"> 
    <%= Html.AvatarFor(Model.CommentInfo.Owner) %> 
    </span> 
    <strong class="comment-author"> 
    <%= Html.Encode(Model.GetAuthorString()) %> 
    </strong> 
    says: 
    </p> 
    <p class="comment-date"> 
    <%= Html.TimeAgo(Model.CommentInfo.LocalTimeStamp) %> 
    </p> 
</div> 

<div class="comment-body"> 
    <div class="formatted-content"> 
    <%= Html.Encode(Model.CommentInfo.Comment) %> 
    </div> 
    <div class="form-content"> 
    <% using(Html.BeginForm(
        "EditComment", 
        "Comments", 
        new 
        { 
     repository = Model.Repository, 
     commentId = Model.CommentInfo.Id 
     }, 
        FormMethod.Post, 
        null)) 
     { %> 
      <%= Html.AntiForgeryToken() %> 
     <%= Html.TextBox("newComment", Model.CommentInfo.Comment) %> 

     <div class="form-actions"> 
     <a class"edit-cancel minibutton" href="#"> 
      <span>Cancel</span> 
     </a> 
     <button class="minibutton" type="submit"> 
      <span>Update comment</span> 
     </button> 
     </div> 
     <% 
     } 
    %> 
    </div> 
</div> 
</div> 
+0

Avez-vous vérifié que le même code fonctionne sous MS .NET? –

+0

J'utilise AntiForgeryToken dans la webapp MVC hébergée sur apache avec mod_mono et cela fonctionne sans problèmes. Pouvez-vous dépasser votre vue et le code du contrôleur? – yojimbo87

+0

@Tomi: Bien sûr, je suis en train de mettre à jour le post pour coller le code de la vue. Le contrôleur n'est pas un problème, échoue uniquement la compilation de la vue lors de l'exécution. –

Répondre

2

Avez-vous [ValidateAntiForgeryToken] attribut défini vous l'action du contrôleur qui sert le verbe POST? La solution possible pour ce problème est probablement l'utilisation de la dernière version mono de la branche master, car ce problème peut être répliqué sur les anciennes versions de mono (par exemple, l'archive tar du 22 avril provoque la même exception).

Éditer 2: Ce qui est probablement vraiment nécessaire pour que cela fonctionne est la configuration valide machineKey element dans le fichier web.config. Les clés peuvent être générées par exemple avec l'utilitaire this.

+0

@Tomi: Oui, le problème est dans la vue partielle. En fait, si je supprime le 'Html.AntiForgeryToken()' de la vue, le contrôleur fonctionne bien en lançant une exception (le jeton antiforguery requis n'a pas été trouvé ...). –

+0

Hmm, ça a l'air bizarre. Pouvez-vous passer la source html générée pour voir si le jeton anti-falsification est présent dans le champ caché sous votre formulaire? – yojimbo87

+0

@Tommy: Une idée? Quelle version de Mono essayez-vous? –