2016-05-02 14 views
-1

Ich verwende MVC mit Modell zuerst. Ich benutzte [ValidateInput(false)] auf meinem Controller, der eine Rich-Text-Eingabe akzeptiert. Das hat gut funktioniert. Jetzt habe ich den folgenden Beitrag gefunden, der mir erlaubt, [AllowHtml] zu verwenden, was ich bevorzugen würde (post).AllowHtml funktioniert nicht mit Modell zuerst

[MetadataType(typeof(YourEntityMetadata))] 
public partial class YourEntityClass 
{    
} 

public class YourEntityMetadata 
{ 
    [AllowHtml] 
    public string YourPropertyWithHtml { get; set; } 
} 

Ich versuchte dies, aber es hat nicht funktioniert. Aus Testgründen habe ich AllowHtml direkt auf die Eigenschaft im automatisch generierten Modell hinzugefügt, was ebenfalls nicht funktioniert hat. In beiden Fällen habe ich den gleichen Fehler "potentiell gefährliche Anfrage ..."

Die Eingabe ist ein einfacher Rich Text <p> lorem <\p> von CKEditor. Der Controller ruft eine separate Funktion auf, die den eigentlichen Schreibzugriff auf die Datenbank und den Zugriff auf das Model ModelContainer zuerst ausführt.

Gibt es in der automatischen Generierung etwas, das die [AllowHtml] möglicherweise verhindert. Ist es ein Problem, dass der Controller nicht direkt auf die Entität zugreift oder sie erstellt, sondern die Zeichenfolge an eine andere Funktion weitergibt, die die Entität erstellt und sie in der Datenbank speichert?

EDIT

ich die Filter, die für die XSRF Token überprüfen deaktiviert. Ich habe den Validierungsmodus Set Anfrage:

<httpRuntime targetFramework="4.6.1" requestValidationMode="2.0" /> 

I, um die Controller-Methode abgespeckte:

public int SaveBlock(string blockCont) 
{ 
    var testt = new ViewTest() { BlockContent = blockCont }; 
    return 0; 
} 

mit einem einfachen Blick Modell:

public class ViewTest 
{ 
    [AllowHtml] 
    public string BlockContent { get; set; } 
} 

und immer noch die Anforderung markiert mit ein "potentiell gefährlicher" Fehler.

+1

'[AllowHtml]' funktioniert gut, vorausgesetzt, es wird auf die richtige Eigenschaft angewendet. –

+0

Sie sollten nichts auf den automatisch generierten Klassencode setzen. Tatsächlich brauchen Sie diese Eigenschaft in Ihrer Entitätsklasse wirklich nicht. Sie sollten ein Ansichtsmodell erstellen, um Daten von Ihrer Sicht in die Aktionsmethode zu übertragen und dieses Attribut auf die entsprechende Eigenschaft anzuwenden. – Shyju

+0

Werfen Sie einen Blick auf [diese Antwort] (http://stackoverflow.com/a/4866070/6268935) und [diese Antwort] (http://stackoverflow.com/a/82170/6268935). – Arman

Antwort

0

Ich lese ein bisschen mehr in das Problem mit den nützlichen Kommentare im Hinterkopf. Meine Verwirrung war, dass ich dachte, dass die Datenannotationen angewendet werden, wenn Daten in das Modell geschrieben werden, nicht wenn es in der Controller-Methode akzeptiert wird.

Also natürlich mein Ansatz, eine Zeichenfolge an den Controller zu senden und zu hoffen, dass es validiert wird, wenn ich es tatsächlich in das Modell schreibe, war falsch. Vielleicht wollte ich ein bisschen zu viel.

Für meinen Ansatz, bei dem ich meine Datenmodelle so weit wie möglich von der Steuerung trennen möchte (unter Verwendung eines Repositorys), wäre der einzige Weg nach vorne ein Ansichtsmodell der an die Steuerung gesendeten Eingabe. In meinem Fall nehme ich jedoch an, dass ich bei der Codierung der wenigen Nicht-HTML-Zeichenfolgeneingaben bleiben werde, um nur die eine HTML-Eingabe durch die Datenbank zuzulassen.