it-swarm.com.de

ASP .NET MVC Deaktivieren der clientseitigen Validierung auf Feldebene

Ich verwende ASP .NET MVC 3 mit Data Annotations und dem Plugin jQuery validate.

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

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 dazu entscheidet, die Javascript-Validierung zu hacken), sodass ich ihn nicht auf der Clientseite ausführen muss. Aber ich möchte immer noch, dass die andere Prüfung clientseitig läuft.

67
Ryan

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

Sie können einfach die clientseitige Validierung in der Razor-Ansicht deaktivieren, bevor Sie das Feld rendern, und die clientseitige Validierung erneut aktivieren, nachdem das Feld gerendert wurde.

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.

98
Lorenzo Melato

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.DataAnnotations-Attributen hinzufügt. Das HTML-Element wird weiterhin mit anderen Validierungsattributen versehen (z. B. data-val-required), sie haben jedoch keine Auswirkungen.

( Beachten Sie den Unterstrich in data_val oben. MVC konvertiert Unterstriche automatisch in Bindestriche in anonymen Typeneigenschaften, sodass data_val bei der Wiedergabe von HTML data-val wird.)

79
Ross McNab

MVC5 verwende jquery.validate

http://jqueryvalidation.org/rules/

Wenn Sie Validierungen in der MVC5-Client-Seite entfernen möchten, müssen Sie folgende Schritte ausführen:

Alle Validierungen von 'myinput' entfernen

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

Spezifische Validierungen

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

Auflistung der Validierungen kann helfen

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

Dann müssen Sie Ihren Code Behind korrigieren, um Ihr Modell manuell zu überprüfen oder anders, da ModelState.IsValid falsch ist. Die Verwendung von ModelState.Clear() und TryValidateModel kann dann nützlich sein.

Bearbeiten:

Durch Deaktivieren der Kontrolle werden auch die Validierungen entfernt.

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

Wenn Sie die unauffällige Standardvalidierung verwenden, können Sie mit Hilfe von JavaScript Regeln auf der Clientseite entfernen. Werfen Sie einen Blick auf Plugins/Validation/rules

7
archil

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 zwangsweise deaktivieren.

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

Beachten Sie das @ data_val = "false". Die Validierung für dieses Feld wird deaktiviert.

Serverseite (In Aktion)

Wenn das Modell für die Nachaktion validiert 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, zuerst rufen wir die aktuellen Informationen ab, die in der Datenbank gespeichert sind und die wir später verwenden, um das aktuelle Modell zuzuweisen, wenn kein Kennwort angegeben wird. Die letzten beiden Zeilen setzen ModelState tatsächlich zurück, um ein aktualisiertes Ergebnis in ModelState.IsValid zurückzugeben.

4
The Angry Coder

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

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

zum Beispiel;

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

Wenn Sie Validierungen in der MVC5-Client-Seite entfernen möchten, müssen Sie folgende Schritte ausführen:

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