36 votes

Comment éviter une exception HttpRequestValidationException dans ASP.NET MVC lors du rendu de la même vue que celle à l'origine de l'exception

Je veux juste savoir comment valider (ou propre) la saisie de l'utilisateur dans ASP.NET MVC, de sorte qu'un HttpRequestValidationException ne sera pas levée quelles que soient les valeurs présentées. Par exemple, avec une saisie de texte, si les entrées de l'utilisateur <BR/>, il va provoquer une exception et le Jaune de l'Écran de la Mort, sera montré. Je n'en veux pas. Je voulez attraper l'exception et de rendre visible un convivial erreur dans la vue actuelle, de préférence avec les contrôles chargé avec les mêmes valeurs présentées.

J'ai trouvé cette http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.htmlmais c'est inutile pour mon but. Aussi, j'ai trouvé ce http://msdn.microsoft.com/en-us/library/aa973813.aspx et essayé de la mettre à l'intérieur d'un modèle de classeur mais je ne pouvais pas le faire fonctionner.

40voto

user66787 Points 286

Avec la dernière version d'ASP.NET MVC (le RC, au moment de l'écriture de ceci), vous pouvez simplement attribuer un attribut à votre classe de contrôleur ou à votre méthode d'action, par exemple:

 [ValidateInput(false)]
public ActionResult create()
{
    // ...method body
}
 

ValidateInputAttribute se trouve dans System.Web.Mvc.

Mais comme d’autres l’ont dit, vous devez alors effectuer votre propre validation ou nettoyage d’entrée manuelle.

Avec MVC 3, vous devez également vous assurer que cela figure dans votre configuration Web: <system.web><httpRuntime requestValidationMode="2.0" /></system.web>

12voto

En ASP net MVC 3, vous pouvez utiliser l' [AllowHtml] d'attribut sur les champs individuels/propriétés de votre Modèle/ViewModel pour désactiver la validation uniquement pour le champ, ce qui est assez agréable. Je vais ajouter cet attribut de certains champs dans mon modèle, puis d'utiliser l'excellent anti-xss bibliothèque (également disponible via NuGet) pour assainir la saisie de l'utilisateur en appelant l' Sanitizer.GetSafeHtmlFragment(mymodel.Description) (lorsque la propriété "Description" est une propriété de chaîne sur mon modèle de vue, qui a l' [AllowHtml] attribut appliqué)

4voto

JoshNaro Points 1306

Pour une description détaillée exemple de la façon de prendre du ce (et d'autres) des exceptions avec un filtre à voir: http://code.google.com/p/geochat/source/browse/Source/Web/GeoChat.MvcExtensions/ExceptionHandlerAttribute.cs

Cela vous permettra de garder la validation, mais d'éviter à l'utilisateur de voir le "jaune de l'écran de la mort".

C'est une forme simplifiée (peut-être simpliste) version:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true), AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
public class ExceptionHandlerAttribute : FilterAttribute, IExceptionFilter {

private HandleErrorAttribute attribute = new HandleErrorAttribute();

public ExceptionHandlerAttribute() {
  this.ExceptionType = typeof(Exception);
  this.Order = 1;
}

public string View {
  get {
    return attribute.View;
  }
  set {
    attribute.View = value;
  }
}

public Type ExceptionType {
  get {
    return attribute.ExceptionType;
  }
  set {
    attribute.ExceptionType = value;
  }
}

public void OnException(ExceptionContext filterContext) {
  if (this.ExceptionType.IsInstanceOfType(filterContext.Exception)) {
    string controller = (string)filterContext.RouteData.Values["controller"];
    string action = (string)filterContext.RouteData.Values["action"];
    if (controller == null)
      controller = String.Empty;

    if (action == null)
      action = String.Empty;

    HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controller, action);
    ViewResult result = new ViewResult();
    result.ViewName = this.View;
    result.MasterName = String.Empty;
    result.ViewData = new ViewDataDictionary<HandleErrorInfo>(model);

    result.TempData = filterContext.Controller.TempData;
    filterContext.Result = result;

    filterContext.ExceptionHandled = true;
    filterContext.HttpContext.Response.Clear();
    filterContext.HttpContext.Response.StatusCode = 500;
  }
}

}

1voto

tvanfosson Points 268301

Au lieu de détecter l'erreur dans global.asax Application_Error, vous pouvez la détecter en ajoutant un gestionnaire d'erreurs pour le contrôleur qui capture explicitement cette erreur et redirige vers la vue avec un message d'erreur et les données de vue appropriées.

J'ai trouvé ceci, un peu vieux, post sur la façon de faire cela avec des attributs.

1voto

dariol Points 1450

ValidateInputAttribute est la méthode appropriée pour désactiver la validation de la demande. La méthode déclarative dans la vue (aspx) ne fonctionne pas car le contrôleur est responsable de la réception de la demande (et non de la vue / aspx).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X