Was ist der beste Weg, um auf der Clientseite mithilfe von MVC und Datenanmerkungen einen Validator größer als 0 hinzuzufügen?

92

Ich möchte nur zulassen können, dass ein Formular gesendet wird, wenn der Wert in einem bestimmten Feld größer als 0 ist. Ich dachte, das Mvc-Bereichsattribut würde es mir ermöglichen, nur einen Wert einzugeben, um nur einen Test größer als zu kennzeichnen Kein Glück, da es auf minimalen UND maximalen Werten besteht.

Irgendwelche Ideen, wie dies erreicht werden kann?

Jaffa
quelle

Antworten:

240

Sie können keine Zahl speichern, die größer ist als der zugrunde liegende Datentyp. Daher ist es sehr gut, dass für das Range-Attribut ein Maximalwert erforderlich ist. Denken Sie daran, dass dies in der realen Welt nicht existiert. Daher sollte Folgendes funktionieren:

[Range(1, int.MaxValue, ErrorMessage = "Please enter a value bigger than {1}")]
public int Value { get; set; }
Darin Dimitrov
quelle
Der Nachteil dieses Ansatzes ist, dass bei der Validierung von "abcd" Folgendes angezeigt wird : Please enter a value less than or equal to 2147483647.
Mike Cole
2
Das wird es mit Sicherheit nicht tun, da er eine benutzerdefinierte Fehlermeldung übergeben hat.
John Lord
12

Ich fand diese Antwort, um einen positiven Wert für ein float / double zu validieren. Es stellt sich heraus, dass diese Typen eine nützliche Konstante für 'Epsilon' haben.

Stellt das kleinste positive System dar. Doppelwert, der größer als Null ist.

    [Required]
    [Range(double.Epsilon, double.MaxValue)]
    public double Length { get; set; }
Phil
quelle
Epsilon ist eigentlich eine Kalkülfunktion. Es handelt sich um eine "Limit" -Funktion, die im Grunde genommen "die kleinste Zahl, die von Null unterschieden werden kann" sagt, sodass Sie möglicherweise Einträge von .00000001 erhalten. Ich würde eine realistische Zahl auf die min setzen.
John Lord
8

Sie können Ihren eigenen Validator wie folgt erstellen:

    public class RequiredGreaterThanZero : ValidationAttribute
{
    /// <summary>
    /// Designed for dropdowns to ensure that a selection is valid and not the dummy "SELECT" entry
    /// </summary>
    /// <param name="value">The integer value of the selection</param>
    /// <returns>True if value is greater than zero</returns>
    public override bool IsValid(object value)
    {
        // return true if value is a non-null number > 0, otherwise return false
        int i;
        return value != null && int.TryParse(value.ToString(), out i) && i > 0;
    }
}

Fügen Sie diese Datei dann in Ihr Modell ein und verwenden Sie sie als Attribut wie folgt:

    [RequiredGreaterThanZero]
    [DisplayName("Driver")]
    public int DriverID { get; set; }

Ich verwende dies normalerweise bei der Dropdown-Validierung.

John Lord
quelle
1
Am Ende habe ich diese Antwort für eine andere Situation verwendet, für die ein benutzerdefinierter Validator erforderlich war. Für eine einfache Ganzzahl, die größer als Null ist, sollte Darins Antwort verwendet werden.
Zach
Eigentlich bevorzuge ich auch seine Methode, aber die Leute, mit denen ich zusammenarbeite, haben ein Problem damit, Werte willkürlich zu begrenzen.
John Lord
Ha, das scheint seltsam. Ich konnte ihre Argumentation sehen, wenn der gültige Bereich kleiner als die maximale Ganzzahlgröße war.
Zach
Es ist eher ein Problem mit Dezimalstellen. Ohne hinzuschauen, bin ich mir ziemlich sicher, dass man keine Min- oder Max-Funktion eingebaut hat.
John Lord
Das war die beste Lösung für mich!
Dave Stuart