ASP .NET MVC Deaktiviert die clientseitige Validierung auf Feldebene

74

Ich verwende ASP .NET MVC 3 mit Datenanmerkungen und dem jQuery-Validierungs-Plugin.

Gibt es eine Möglichkeit zu markieren, dass ein bestimmtes Feld (oder eine bestimmte Datenanmerkung) nur serverseitig validiert werden soll?

Ich habe ein Telefonnummernfeld mit einem Maskierungs-Plugin, und der Validator für reguläre Ausdrücke wird vom Benutzer verrückt. Der reguläre Ausdruck ist nur ausfallsicher (falls sich jemand entscheidet, die Javascript-Validierung zu hacken), sodass er nicht auf der Clientseite ausgeführt werden muss. Ich möchte jedoch, dass die andere Validierung clientseitig ausgeführt wird.

Ryan
quelle

Antworten:

103

Ich bin nicht sicher, ob diese Lösung auf MVC3 funktioniert. Es funktioniert sicherlich auf MVC4:

Sie können die clientseitige Validierung in der Razor-Ansicht einfach deaktivieren, bevor Sie das Feld rendern, und die clientseitige Validierung nach dem Rendern des Felds wieder aktivieren.

Beispiel:

<div class="editor-field">
    @{ Html.EnableClientValidation(false); }
    @Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" })
    @{ Html.EnableClientValidation(true); }
</div>

Hier deaktivieren wir die clientseitige Validierung für das Feld BatchId.

Auch dafür habe ich einen kleinen Helfer entwickelt:

public static class YnnovaHtmlHelper
{
    public static ClientSideValidationDisabler BeginDisableClientSideValidation(this HtmlHelper html)
    {
        return new ClientSideValidationDisabler(html);
    }
}

public class ClientSideValidationDisabler : IDisposable
{
    private HtmlHelper _html;

    public ClientSideValidationDisabler(HtmlHelper html)
    {
        _html = html;
        _html.EnableClientValidation(false);
    }

    public void Dispose()
    {
        _html.EnableClientValidation(true);
        _html = null;
    }
}

Sie werden es wie folgt verwenden:

<div class="editor-field">
    @using (Html.BeginDisableClientSideValidation()) {
        @Html.TextBoxFor(m => m.BatchId, new { @class = "k-textbox" })
    }
</div>

Wenn jemand bessere Lösungen hat, lass es mich wissen!

Ich hoffe das hilft.

Lorenzo Melato
quelle
2
Schön, außer dass die Validierung aktiviert wird, auch wenn sie von Anfang an deaktiviert war.
Ian Warburton
4
Sicher kann es verbessert werden!
Lorenzo Melato
Ich habe es in einer etwas komplizierteren Situation zum Laufen gebracht, eine einzelne Validierung zu entfernen, wenn das Feld mehrere Validatoren hat, indem ich herausgefunden habe, welche Datenattribute von diesem bestimmten Validierungsanbieter hinzugefügt wurden, und sie auf eine leere Zeichenfolge gesetzt habe. Es funktioniert soweit. Vielen Dank für den Vorschlag.
Stephenbayer
Dies ist eine sehr gute Lösung, da auf der Seite weniger Text in die Quelle geladen wird. Durch unnötigen Validierungstext wurden die Ladezeiten spürbar verbessert.
Lloyd
92

Sie können die clientseitige unauffällige Validierung für ein einzelnes Feld deaktivieren, indem Sie ein data-val='false'Attribut hinzufügen :

@Html.TextBoxFor(m => m.BatchId, new { data_val = "false" })

Dadurch wird das data-val='true'Attribut überschrieben , das MVC aufgrund von System.ComponentModel.DataAnnotationsAttributen hinzufügt . Das HTML-Element wird weiterhin mit anderen Validierungsattributen dekoriert (z. B. Datenwert erforderlich), diese haben jedoch keine Auswirkung.

( Beachten Sie den Unterstrich in data_valoben. MVC automatisch Unterstrichen zu Bindestriche in anonymen Typ Eigenschaften konvertiert, so data_valwird , data-valwenn die HTML - Rendering)

Ross McNab
quelle
Wenn ich den Unterstrich nicht setze, gibt mir IIS eine Ausnahme. Compiler-Fehlermeldung: CS0746: Ungültiger Deklarator für anonyme Mitglieder. Mitglieder vom anonymen Typ müssen mit einer Mitgliederzuweisung, einem einfachen Namen oder einem Mitgliederzugriff deklariert werden.
csharpforevermore
2
Dies funktionierte wie ein Zauber und ist die sauberste Lösung für dieses Problem, das ich bisher gefunden habe.
John Sully
3
Dies funktioniert hervorragend und ist die sauberste Lösung. Vielen Dank!
Patrick
3
Das @data_val rendert nicht "data-val" in MVC 5.
Soppus
Es funktioniert so: @ Html.EditorFor (model => model.Phone2, new {htmlAttributes = new {data_val_number = "Muss numerisch sein"}})
xeshu
19

MVC5 verwendet jquery.validate

http://jqueryvalidation.org/rules/

Wenn Sie Validierungen in MVC5 clientseitig entfernen möchten, müssen Sie Folgendes tun:

Entfernen Sie alle Überprüfungen auf 'myinput'.

$("#myinput").rules("remove");

Spezifische Validierungen

$("#myinput").rules("remove", "min max" );

Das Auflisten der Validierungen kann helfen

$("#myinput").rules();

Dann müssen Sie Ihren Code Behind korrigieren, um Ihr Modell manuell oder anders zu validieren, da ModelState.IsValiddies falsch ist. Verwenden ModelState.Clear()und TryValidateModelkann dann praktisch sein.

Bearbeiten:

Durch Deaktivieren des Steuerelements werden auch die Überprüfungen entfernt.

$("#myinput").attr('disabled', disabledValue);
Guish
quelle
7

Angenommen, Sie verwenden die unauffällige Standardüberprüfung, können Sie Javascript verwenden, um Regeln auf der Clientseite zu entfernen. Schauen Sie sich Plugins / Validation / Regeln an

Archil
quelle
4

Um dieses Ziel im gegebenen Szenario zu erreichen, müssen wir zwei Optimierungen vornehmen.

Client-Seite

Um die clientseitige Validierung zu deaktivieren, müssen wir sie mit Gewalt deaktivieren.

@Html.EditorFor(model => model.Password, new { htmlAttributes = new {  @data_val = "false" , @class = "form-control"} })

Beachten Sie das @ data_val = "false". Dadurch wird die Validierung in diesem Feld deaktiviert.

Serverseite (in Aktion)

Wenn das Modell in der Post-Aktion überprüft wird, gibt ModelState.IsValid immer false zurück, da kein Kennwort angegeben wird. Hier müssen wir das aktuelle Passwort für das Modell angeben und das Modell erneut validieren.

var userObj = db.Users_Info.Where(a => a.Id == users_Info.Id).FirstOrDefault();
if (String.IsNullOrEmpty(users_Info.Password))
{
  users_Info.Password = userObj.Password;
}
ModelState.Clear();
TryValidateModel(users_Info);

Lassen Sie mich erklären, dass wir zuerst die aktuellen Informationen abrufen, die in der Datenbank gespeichert sind und die wir später verwenden, um sie dem aktuellen Modell zuzuweisen, wenn kein Kennwort angegeben ist. Die letzten beiden Zeilen setzen den ModelState tatsächlich zurück, um ein aktualisiertes Ergebnis für ModelState.IsValid zurückzugeben.

Wütender Coder
quelle
1

Ich hatte Probleme mit data_val = "true". Ich hatte eine Folge von Optionsfeldern, die an eine einzelne Eigenschaft in meinem Modell gebunden waren. Die Datenüberprüfung funktionierte nur, wenn ich data_val = "true" auf den ersten @ Html.RadioButtonFor-Aufruf angewendet habe.

Beim Debuggen habe ich festgestellt, dass Sie auch einzelne Regeln auf der Clientseite mithilfe von data_rule _ ?? deaktivieren oder ändern können. Die Regeln finden Sie in der Dokumentation zur jquery-Validierung .

zum Beispiel;

@Html.RadioButtonFor(m => m.Answer, "Yes", new { data_rule_Required = "false" });
@Html.TextBoxFor(m => m.Answer, new { data_rule_minlength = "10" }
Peter Henry
quelle
0

Wenn Sie Validierungen in MVC5 clientseitig entfernen möchten, müssen Sie Folgendes tun:

$("#Email").rules("remove", {
                        "required",
                        "minlength",
                        "email"                           
                        }
                    });
Mantu
quelle