Ich verwende ASP.NET MVC und möchte, dass alle vom Benutzer eingegebenen Zeichenfolgenfelder gekürzt werden, bevor sie in die Datenbank eingefügt werden. Und da ich viele Dateneingabeformulare habe, suche ich nach einer eleganten Möglichkeit, alle Zeichenfolgen zu kürzen, anstatt jeden vom Benutzer angegebenen Zeichenfolgenwert explizit zu kürzen. Ich bin interessiert zu wissen, wie und wann Leute Saiten schneiden.
Ich habe darüber nachgedacht, vielleicht einen benutzerdefinierten Modellordner zu erstellen und dort alle Zeichenfolgenwerte zu kürzen. Auf diese Weise ist meine gesamte Trimmlogik an einem Ort enthalten. Ist das ein guter Ansatz? Gibt es Codebeispiele, die dies tun?
quelle
type="password"
Eingaben unberührt zu lassen?Dies ist @takepara dieselbe Auflösung, jedoch als IModelBinder anstelle von DefaultModelBinder, sodass das Hinzufügen des Modellbinders in global.asax abgeschlossen ist
Die Klasse:
basierend auf @haacked post: http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx
quelle
return
Anweisungen ändern und die Bedingung negieren:if (valueResult == null || string.IsNullOrEmpty(valueResult.AttemptedValue)) return null;
[AllowHtml]
Attribut auf Modelleigenschaften zu brechen (zusammen mit dem[ValidateInput(false)]
oben erwähnten CodeGrueEine Verbesserung der Antwort von @takepara.
Irgendwo im Projekt:
In TrimModelBinder Klassenwechsel
zu
und Sie können Eigenschaften, die vom Zuschneiden ausgeschlossen werden sollen, mit dem Attribut [NoTrim] markieren.
quelle
.Cast<object>().Any(a => a.GetType() == typeof(NoTrimAttribute))
mit.OfType<NoTrimAttribute>().Any()
. Nur ein bisschen sauberer.Mit Verbesserungen in C # 6 können Sie jetzt einen sehr kompakten Modellordner schreiben, der alle Zeichenfolgeneingaben trimmt:
Sie müssen diese Zeile irgendwo in
Application_Start()
IhreGlobal.asax.cs
Datei aufnehmen, um den Modellordner beim Binden vonstring
s verwenden zu können:Ich finde es besser, einen Modellordner wie diesen zu verwenden, als den Standardmodellordner zu überschreiben, da er dann immer dann verwendet wird, wenn Sie a binden
string
, sei es direkt als Methodenargument oder als Eigenschaft für eine Modellklasse. Wenn Sie jedoch den Standardmodellordner überschreiben, wie andere Antworten hier vorschlagen, funktioniert dies nur , wenn Sie Eigenschaften für Modelle binden, nicht, wenn Siestring
ein Argument für eine Aktionsmethode habenBearbeiten: Ein Kommentator fragte nach dem Umgang mit der Situation, in der ein Feld nicht validiert werden sollte. Meine ursprüngliche Antwort wurde reduziert, um nur die Frage zu behandeln, die das OP gestellt hatte. Für Interessierte können Sie sich jedoch mit der Validierung befassen, indem Sie den folgenden erweiterten Modellordner verwenden:
quelle
In ASP.Net Core 2 hat dies bei mir funktioniert. Ich verwende das
[FromBody]
Attribut in meinen Controllern und in der JSON-Eingabe. Um die Zeichenfolgenbehandlung bei der JSON-Deserialisierung zu überschreiben, habe ich meinen eigenen JsonConverter registriert:Und das ist der Konverter:
quelle
Eine andere Variante von @ takeparas Antwort, aber mit einer anderen Wendung:
1) Ich bevorzuge den Opt-In-Attributmechanismus "StringTrim" (anstelle des Opt-Out-Beispiels "NoTrim" von @Anton).
2) Ein zusätzlicher Aufruf von SetModelValue ist erforderlich, um sicherzustellen, dass der ModelState korrekt ausgefüllt ist und das Standardmuster für Validierung / Akzeptieren / Ablehnen wie gewohnt verwendet werden kann, dh TryUpdateModel (Modell) zum Anwenden und ModelState.Clear () zum Akzeptieren aller Änderungen.
Fügen Sie dies in Ihre Entität / gemeinsam genutzte Bibliothek ein:
Dann dies in Ihrer MVC-Anwendung / Bibliothek:
Wenn Sie den Eigenschaftswert nicht im Ordner festlegen, auch wenn Sie nichts ändern möchten, blockieren Sie diese Eigenschaft vollständig aus ModelState! Dies liegt daran, dass Sie als bindend für alle Zeichenfolgentypen registriert sind. Daher scheint es (in meinen Tests), dass der Standardordner dies dann nicht für Sie erledigt.
quelle
Zusätzliche Informationen für alle, die dies in ASP.NET Core 1.0 suchen. Die Logik hat sich sehr verändert.
Ich habe einen Blog-Beitrag darüber geschrieben, wie es geht. Er erklärt die Dinge etwas detaillierter
Also ASP.NET Core 1.0-Lösung:
Modellbinder für das eigentliche Trimmen
Außerdem benötigen Sie in der neuesten Version den Model Binder Provider. Dies gibt an, ob dieser Binder für dieses Modell verwendet werden soll
Dann muss es in Startup.cs registriert werden
quelle
Während ich die hervorragenden Antworten und Kommentare oben durchlas und zunehmend verwirrt wurde, dachte ich plötzlich: Hey, ich frage mich, ob es eine jQuery-Lösung gibt. Für andere, die ModelBinders wie ich etwas verwirrend finden, biete ich das folgende jQuery-Snippet an, das die Eingabefelder schneidet, bevor das Formular gesendet wird.
quelle
Im Falle von MVC Core
Bindemittel:
Anbieter:
Registrierungsfunktion:
Registrieren:
quelle
SimpleTypeModelBinderProvider
indem ich denselben Index behalte.Spät zur Party, aber das Folgende ist eine Zusammenfassung der Anpassungen, die für MVC 5.2.3 erforderlich sind, wenn Sie die
skipValidation
Anforderungen der integrierten Wertanbieter erfüllen möchten.Global.asax
quelle
Ich bin mit der Lösung nicht einverstanden. Sie sollten GetPropertyValue überschreiben, da die Daten für SetProperty auch vom ModelState gefüllt werden können. Um die Rohdaten von den Eingabeelementen abzufangen, schreiben Sie Folgendes:
Filtern Sie nach propertyDescriptor PropertyType, wenn Sie wirklich nur an Zeichenfolgenwerten interessiert sind, dies aber keine Rolle spielen sollte, da alles, was hereinkommt, im Grunde eine Zeichenfolge ist.
quelle
Ersetzen Sie für ASP.NET Core das
ComplexTypeModelBinderProvider
durch einen Anbieter, der Zeichenfolgen schneidet.Fügen Sie in Ihrer Startcodemethode Folgendes
ConfigureServices
hinzu:Definieren Sie
TrimmingModelBinderProvider
wie folgt :Der hässliche Teil davon ist das Kopieren und Einfügen der
GetBinder
Logik vonComplexTypeModelBinderProvider
, aber es scheint keinen Haken zu geben, mit dem Sie dies vermeiden können.quelle
Ich habe Wertanbieter erstellt, um die Parameterwerte der Abfragezeichenfolge und die Formularwerte zu kürzen. Dies wurde mit ASP.NET Core 3 getestet und funktioniert einwandfrei.
Registrieren Sie dann die Value Provider-Fabriken in der
ConfigureServices()
Funktion in Startup.csquelle
Es gab viele Beiträge, die einen Attributansatz vorschlugen. Hier ist ein Paket, das bereits ein Trim-Attribut und viele andere hat: Dado.ComponentModel.Mutations oder NuGet
Nach dem Aufruf von Mutate () wird user.UserName in mutiert
m@x_speed.01!
.In diesem Beispiel werden Leerzeichen abgeschnitten und die Zeichenfolge in Kleinbuchstaben geschrieben. Es wird keine Validierung eingeführt, aber die
System.ComponentModel.Annotations
kann nebenbei verwendet werdenDado.ComponentModel.Mutations
.quelle
Ich habe dies in einem anderen Thread gepostet. In asp.net Core 2 bin ich in eine andere Richtung gegangen. Ich habe stattdessen einen Aktionsfilter verwendet. In diesem Fall kann der Entwickler es entweder global festlegen oder als Attribut für die Aktionen verwenden, die er zum Trimmen der Zeichenfolge anwenden möchte. Dieser Code wird ausgeführt, nachdem die Modellbindung stattgefunden hat, und kann die Werte im Modellobjekt aktualisieren.
Hier ist mein Code, erstelle zuerst einen Aktionsfilter:
Um es zu verwenden, registrieren Sie sich entweder als globaler Filter oder dekorieren Sie Ihre Aktionen mit dem TrimInputStrings-Attribut.
quelle