2009-04-30 15 views
33

Ich konvertiere eine Anwendung, die ich mit Webforms erstellt, in das asp.net mvc-Framework unter Verwendung von vb.net. Ich habe ein Problem mit einer meiner Ansichten. Ich erhalte den gelben Bildschirm mit dem Hinweis "Eine potenziell gefährliche Anfrage. Der Formularwert wurde vom Client erkannt", wenn ich mein Formular abschicke. Ich benutze Tinymce als meine RTE. Ich habe auf der Ansicht setzte sichWarum funktioniert ValidateInput (False) nicht?

ValidateRequest = „false“

Ich weiß, dass in MVC ist es nicht aus für die Sicht respektieren, was ich bisher gelesen habe. Also setze ich es auch auf die Controller-Aktion. Ich habe verschiedene Setups ausprobiert:

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

... und ...

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

... und wie dies auch ...

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

Nur wenn es zu sehen hat einen Unterschied gemacht, aber ich bekomme immer noch den gelben Bildschirm des Todes. Ich möchte nur für diese Ansicht und die spezifische Aktion in meinem Controller festlegen, dass mein Beitrag betrifft. Fehle ich etwas?

Antwort

17

Sind Sie sicher, dass die Controller-Aktion, auf die gebucht wird, die ist, auf der Sie die Attribute haben?

+0

Sie sind ein Lebensretter! Ich habe mich gestern bei diesem Projekt verbrannt. Das nervt mich seit gestern Abend und ich dachte, es würde helfen, wenn ich darauf schlafen würde. Aber ja, meine Formularaktion war leer, weil ich meine jQuery-Validierung für diese Ansicht getestet hatte und vergessen hatte, die Url.Action zurückzusetzen. Ich fühle mich verlegen lol. – Nurvx

+16

Wir alle Fehler, ohne sie würde niemand lernen. :) –

+0

In meinem Fall habe ich eine Methode, die sowohl ein vollständiges Modell als auch einige zusätzliche Parameter (wie 'Speichern (SomeModel-Modell, String inputFromMemo) ') erhält. Zuerst habe ich nur 'Save (SomeModel model)' programmiert. Das Hinzufügen des anderen Parameters hat es behoben. –

130

Mit asp.net 4 müssen Sie den Validierungsmodus auch in der web.config konfigurieren.

Set die folgenden als Kind des <system.web> Element:

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

Asp.Net 4 setzt die requestValidationMode auf 4.0 standardmäßig, die das System sagt Anforderungsüberprüfung vor der BeginRequst Phase der HTTP-Anforderung zu erfüllen . Die Validierung wird durchgeführt, bevor das System das Aktionsattribut erreicht, in dem es angewiesen wird, die Anforderung nicht zu validieren, wodurch das Attribut nutzlos wird. Das Festlegen von requestValidationMode = "2.0" wird auf das Validierungsverhalten von asp.net 2.0-Anforderungen zurückgesetzt, sodass das Attribut ValidateInput wie erwartet funktionieren kann.

+17

wird das für MVC 3 "behoben"? –

+0

Ausgezeichnet, das ist genau das, was ich brauchte. Vielen Dank. –

+8

Was sind die anderen Dinge zu beachten, wenn wir es auf 2.0 zurücksetzen? –

3

Wenn Sie Ihr eigenes Modell Bindemittel verwenden, die den IModelBinder-Schnittstelle implementieren, werden Sie feststellen, dass dieser benutzerdefinierte Modell Binder die Daten immer validieren, unabhängig alle Attribute. Sie können wenige Zeilen Code hinzufügen, um die benutzerdefinierten Modell Binder die ValidateInput Filter der Aktionen respektieren zu machen:

 // 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... 
     } 

Diese sehr schön hier von Martijn Boland erklärt: http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/

0

Fügen Sie die folgende Zeile Code:

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

zu der Application_Start() -Methode.

+6

Dadurch wird die Validierung für ALLE Controller-Aktionen deaktiviert, die Sie wahrscheinlich nicht ausführen möchten. –

1

Sie können versuchen, das Feld wie HttpContext.Request.Unvalidated.Form [ „Feldname“]

+0

Sollte sein: HttpContext.Current.Request.Unvalidated.Form ["FieldName"] –

0

Falls Sie ein Eingabemodell verwenden und eine AllowHtml Sie auf der Eigenschaft Zugriff wollen, werden Sie nicht blockiert sein.

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

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