2009-04-30 8 views
33

Je suis en train de convertir une application que j'ai créée en utilisant webforms pour le framework asp.net mvc en utilisant vb.net. J'ai un problème avec l'un de mes points de vue. Je reçois l'écran jaune de la mort disant "Une valeur Request.Form potentiellement dangereuse a été détectée par le client" lorsque je soumets mon formulaire. J'utilise tinymce comme mon RTE. J'ai mis sur la vue sePourquoi ValidateInput (False) ne fonctionne pas?

ValidateRequest = « false »

Je sais que dans MVC il ne respecte pas sur le point de vue de ce que je l'ai lu jusqu'à présent. Alors je l'ai mis sur l'action du contrôleur aussi. J'ai essayé différentes configurations:

<ValidateInput(False), AcceptVerbs(HttpVerbs.Post)> _ 

... et ...

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _ 

... et comme ça aussi ...

<ValidateInput(False)> _ 
<AcceptVerbs(HttpVerbs.Post)> _ 

Juste pour voir si elle fait une différence, mais je reçois toujours l'écran jaune de la mort. Je veux seulement le définir pour cette vue et l'action spécifique dans mon contrôleur que mon poste se rapporte à. Est-ce que je manque quelque chose?

Répondre

17

Etes-vous sûr que l'action du contrôleur en cours de publication est celle sur laquelle vous avez les attributs?

+0

Vous êtes un épargnant de vie! Je me suis brûlé sur ce projet hier. Cela m'a dérangé depuis hier soir et je pensais que dormir dessus aiderait. Mais oui, mon action de formulaire était vide de moi testant ma validation de jQuery sur cette vue et j'ai oublié de remettre l'Url.Action. Je me sens embarrassé lol. – Nurvx

+16

Nous avons tous des erreurs, sans eux, personne n'apprendrait. :) –

+0

Dans mon cas, j'ai une méthode qui reçoit à la fois un modèle complet et quelques paramètres supplémentaires (comme 'Save (SomeModel model, string inputFromMemo)'). Premièrement j'ai codé juste 'Save (SomeModel model)'. L'ajout de l'autre paramètre l'a corrigé. –

130

Avec asp.net 4, vous devez également configurer le mode de validation dans le fichier web.config.

définir les paramètres suivants comme un enfant de l'élément <system.web>:

<system.Web> 
    ... 
    <httpRuntime requestValidationMode="2.0"/>  

Asp.Net 4 définit le requestValidationMode à 4.0 par défaut, ce qui indique au système pour effectuer la validation de la demande avant la phase BeginRequst de la requête HTTP . La validation aura lieu avant que le système n'atteigne l'attribut d'action lui disant de ne pas valider la demande, rendant ainsi l'attribut inutile. La définition de requestValidationMode = "2.0" revient au comportement de validation de la requête asp.net 2.0, permettant à l'attribut ValidateInput de fonctionner comme prévu.

+17

cela va-t-il être 'fixé' pour MVC 3? –

+0

Excellent, c'est exactement ce dont j'avais besoin. Merci. –

+8

Quelles sont les autres choses à surveiller si nous revenons à la version 2.0? –

3

Lorsque vous utilisez vos propres classeurs modèles qui mettent en œuvre le, vous remarquerez une interface de IModelBinder que ces liants modèles personnalisés valident toujours les données, quels que soient les attributs. Vous pouvez ajouter quelques lignes de code pour les classeurs modèles personnalisés respectent le filtre ValidateInput des actions:

 // First check if request validation is required 
     var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled; 

     // Get value 
     var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation); 
     if (valueProviderResult != null) 
     { 
      var theValue = valueProviderResult.AttemptedValue; 

      // etc... 
     } 

Ceci est expliqué très bien par Martijn Boland ici: http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/

0

Ajoutez la ligne suivante de code:

GlobalFilters.Filters.Add(new ValidateInputAttribute(false)); 

à la méthode Application_Start().

+6

Cela désactivera la validation sur TOUTES les actions du contrôleur, ce que vous ne voulez probablement pas faire. –

1

Vous pouvez accéder au champ comme HttpContext.Request.Unvalidated.Form [ « FieldName »]

+0

Devrait être: HttpContext.Current.Request.Unvalidated.Form ["FieldName"] –

0

Si vous utilisez un modèle d'entrée et utilisez un AllowHtml sur la propriété que vous voulez, vous serez débloquée.

public class InputModel 
{ 
    [AllowHtml] 
    public string HtmlInput { get; set; } 
} 

... 
[ValidateInput(false)] 
public async Task<ActionResult> ControllerMethod(InputModel model) 
{ 
} 
Questions connexes