Ich habe mich gefragt, ob es möglich ist, das Attribut Erforderliche Validierung in bestimmten Controller-Aktionen zu deaktivieren. Ich frage mich, weil der Benutzer in einem meiner Bearbeitungsformulare keine Werte für Felder eingeben muss, die er zuvor angegeben hat. Allerdings implementiere ich dann die Logik, dass bei der Eingabe eines Werts eine spezielle Logik zum Aktualisieren des Modells verwendet wird, z. B. das Hashing eines Werts usw.
Irgendwelche Vorschläge, wie man dieses Problem umgehen kann?
BEARBEITEN:
Und ja, die Client-Validierung ist hier ein Problem, da sie das Formular nicht ohne Eingabe eines Werts senden kann.
c#
asp.net-mvc
asp.net-mvc-3
data-annotations
Alex Hope O'Connor
quelle
quelle
RequiredAttr
vollständig zu entfernen und bei Bedarf eine serverseitige Überprüfung durchzuführen. Aber das wäre schwierig für den KundenAntworten:
Dieses Problem kann mithilfe von Ansichtsmodellen leicht gelöst werden. Ansichtsmodelle sind Klassen, die speziell auf die Anforderungen einer bestimmten Ansicht zugeschnitten sind. In Ihrem Fall könnten Sie beispielsweise die folgenden Ansichtsmodelle haben:
welche in ihren entsprechenden Controller-Aktionen verwendet werden:
quelle
Update(FormCollection collection)
, zumindest tue ich das nie. Ich definiere und verwende immer ein bestimmtes Ansichtsmodell :Update(UpdateViewView model)
.Insert
. Vielen Dank für den Hinweis.Wenn Sie die Validierung nur für ein einzelnes Feld auf der Clientseite deaktivieren möchten, können Sie die Validierungsattribute wie folgt überschreiben:
quelle
@Html.TexBoxFor(model => model.SomeValue, new { data_val = false })
- IMO leichter zu lesen.$(".search select").attr('data-val', false);
Ich weiß, dass diese Frage vor langer Zeit beantwortet wurde und die akzeptierte Antwort tatsächlich die Arbeit erledigen wird. Aber eines stört mich: Ich muss nur zwei Modelle kopieren, um eine Validierung zu deaktivieren.
Hier ist mein Vorschlag:
Auf diese Weise müssen Sie sich nicht um clientseitige Validierungen kümmern, das Framework verhält sich so, wie es soll. Wenn Sie ein
[Display]
Attribut für die Basisklasse definieren , müssen Sie es in Ihrer nicht neu definierenUpdateModel
.Und Sie können diese Klassen immer noch auf die gleiche Weise verwenden:
quelle
Sie können alle Überprüfungen von einer Eigenschaft wie folgt in Ihrer Controller-Aktion entfernen.
@ Ians Kommentar zu MVC5
Folgendes ist noch möglich
Etwas ärgerlich, dass Sie die statische Eingabe mit der aktualisierten API verlieren. Sie können etwas Ähnliches wie auf die alte Weise erreichen, indem Sie eine Instanz des HTML- Hilfsprogramms erstellen und NameExtensions-Methoden verwenden .
quelle
ModelState
, die dieser Signatur entspricht. Zumindest nicht in MVC 5.Client-Seite Um die Validierung für ein Formular zu deaktivieren, werden im Folgenden mehrere Optionen angegeben, die auf meinen Recherchen basieren. Einer von ihnen würde hoffentlich für Sie arbeiten.
Option 1
Ich bevorzuge das und das funktioniert perfekt für mich.
und es wie aufrufen
Option 2
Option 3
Option 4
Option 5
Serverseite
Erstellen Sie ein Attribut und markieren Sie Ihre Aktionsmethode mit diesem Attribut. Passen Sie dies an Ihre spezifischen Bedürfnisse an.
Ein besserer Ansatz wurde hier beschrieben. Aktivieren / Deaktivieren der serverseitigen Validierung von MVC dynamisch
quelle
Persönlich würde ich eher den Ansatz verwenden, den Darin Dimitrov in seiner Lösung gezeigt hat. Dies gibt Ihnen die Möglichkeit, den Datenanmerkungsansatz mit Validierung zu verwenden UND auf jedem ViewModel separate Datenattribute zu haben, die der jeweiligen Aufgabe entsprechen. Um den Arbeitsaufwand für das Kopieren zwischen Modell und Ansichtsmodell zu minimieren, sollten Sie sich AutoMapper oder ValueInjecter ansehen . Beide haben ihre individuellen Stärken, also überprüfen Sie beide.
Ein weiterer möglicher Ansatz für Sie wäre, Ihr Ansichtsmodell oder Modell von IValidatableObject abzuleiten. Dies gibt Ihnen die Möglichkeit, eine Funktion Validieren zu implementieren. Bei der Validierung können Sie entweder eine Liste der ValidationResult-Elemente zurückgeben oder für jedes Problem, das Sie bei der Validierung feststellen, eine Ertragsrückgabe ausgeben.
Das ValidationResult besteht aus einer Fehlermeldung und einer Liste von Zeichenfolgen mit den Feldnamen. Die Fehlermeldungen werden an einer Stelle in der Nähe der Eingabefelder angezeigt.
quelle
Ich glaube, der sauberste Weg hier ist, die clientseitige Validierung zu deaktivieren, und auf der Serverseite müssen Sie:
Selbst ein benutzerdefiniertes Ansichtsmodell hier scheint das Problem nicht zu lösen, da die Anzahl dieser vorab beantworteten Felder variieren kann. Wenn dies nicht der Fall ist, ist ein benutzerdefiniertes Ansichtsmodell zwar der einfachste Weg, aber mit der oben genannten Technik können Sie Ihre Validierungsprobleme umgehen.
quelle
Dies war die Antwort eines anderen in den Kommentaren ... aber es sollte eine echte Antwort sein:
$("#SomeValue").removeAttr("data-val-required")
getestet auf MVC 6 mit einem Feld mit dem
[Required]
AttributAntwort gestohlen von https://stackoverflow.com/users/73382/rob oben
quelle
Ich hatte dieses Problem beim Erstellen einer Bearbeitungsansicht für mein Modell und möchte nur ein Feld aktualisieren.
Meine Lösung für den einfachsten Weg besteht darin, die beiden Felder wie folgt zu setzen:
Kommentare ist das Feld, das ich nur in der Bearbeitungsansicht aktualisiere und das kein erforderliches Attribut hat.
ASP.NET MVC 3-Entität
quelle
AFAIK Sie können Attribute nicht zur Laufzeit entfernen, sondern nur ihre Werte ändern (dh: schreibgeschützt wahr / falsch). Suchen Sie hier nach etwas Ähnlichem . Als eine andere Möglichkeit, das zu tun, was Sie wollen, ohne mit Attributen herumzuspielen, werde ich ein ViewModel für Ihre spezifische Aktion verwenden, damit Sie die gesamte Logik einfügen können, ohne die von anderen Controllern benötigte Logik zu beschädigen. Wenn Sie versuchen, eine Art Assistenten (ein Formular mit mehreren Schritten) zu erhalten, können Sie stattdessen die bereits kompilierten Felder serialisieren und mit TempData in Ihre Schritte einbeziehen. (Für Hilfe bei der Deserialisierung der Serialisierung können Sie MVC-Futures verwenden. )
quelle
Was @Darin gesagt hat, würde ich auch empfehlen. Ich möchte jedoch hinzufügen (und als Antwort auf einen der Kommentare), dass Sie diese Methode tatsächlich auch für primitive Typen wie Bit, Bool und sogar Strukturen wie Guid verwenden können, indem Sie sie einfach auf Null setzen. Sobald Sie dies tun,
Required
funktioniert das Attribut wie erwartet.quelle
Ab MVC 5 kann dies leicht erreicht werden, indem Sie dies in Ihre hinzufügen
global.asax
.quelle
Ich suchte nach einer Lösung, bei der ich dasselbe Modell für das Einfügen und Aktualisieren in der Web-API verwenden kann. In meiner Situation ist dies immer ein Körperinhalt. Die
[Requiered]
Attribute müssen übersprungen werden, wenn es sich um eine Aktualisierungsmethode handelt. In meiner Lösung platzieren Sie ein Attribut[IgnoreRequiredValidations]
über der Methode. Dies ist wie folgt:Was muss noch getan werden? Beim Start muss ein eigener BodyModelValidator erstellt und hinzugefügt werden. Dies ist in der HttpConfiguration und sieht folgendermaßen aus:
config.Services.Replace(typeof(IBodyModelValidator), new IgnoreRequiredOrDefaultBodyModelValidator());
Mein eigener BodyModelValidator wird vom DefaultBodyModelValidator abgeleitet. Und ich finde heraus, dass ich die 'ShallowValidate'-Methode überschreiben musste. Bei dieser Überschreibung filtere ich die erforderlichen Modellvalidatoren. Und jetzt die IgnoreRequiredOrDefaultBodyModelValidator-Klasse und die IgnoreRequiredValidations-Attributklasse:
Quellen:
string debug = new StackTrace().ToString()
, um herauszufinden, wer die Modellvalidierung abwickelt.quelle
Wenn Sie kein anderes ViewModel verwenden möchten, können Sie Client-Überprüfungen in der Ansicht deaktivieren und die Überprüfungen auf dem Server für die Eigenschaften entfernen, die Sie ignorieren möchten. Bitte überprüfen Sie diese Antwort für eine ausführlichere Erklärung https://stackoverflow.com/a/15248790/1128216
quelle
In meinem Fall wurde auf vielen Seiten dasselbe Modell für Wiederverwendbarkeitszwecke verwendet. Also habe ich ein benutzerdefiniertes Attribut erstellt, das nach Ausschlüssen sucht
und in Ihrem Controller
Angenommen, das Modell ist
quelle
Ja, das erforderliche Attribut kann deaktiviert werden. Erstellen Sie Ihr eigenes benutzerdefiniertes Klassenattribut (Beispielcode mit dem Namen ChangeableRequired) in RequiredAtribute, fügen Sie eine deaktivierte Eigenschaft hinzu und überschreiben Sie die IsValid-Methode, um zu überprüfen, ob sie deaktiviert ist. Verwenden Sie Reflection, um die deaktivierte Poperty wie folgt festzulegen:
Benutzerdefiniertes Attribut:
Aktualisieren Sie Ihre Eigenschaft, um Ihr neues benutzerdefiniertes Attribut zu verwenden:
Wo Sie die Eigenschaft deaktivieren müssen, verwenden Sie Reflection, um sie festzulegen:
Das fühlt sich gut und sauber an?
NB: Die obige Validierung wird deaktiviert, solange Ihre Objektinstanz aktiv ist.
quelle