Laden...

Clientside Validation - DataAnnotations (Range)

Erstellt von Craze89 vor 12 Jahren Letzter Beitrag vor 12 Jahren 792 Views
C
Craze89 Themenstarter:in
52 Beiträge seit 2008
vor 12 Jahren
Clientside Validation - DataAnnotations (Range)

Hallo Community!

Ich hab da ein kleines Problem beim erstellen einer clientseitigen Validierung per DataAnnotations.
Ich habe ein Propperty, das mit zwei Attributen zur Validierung versehen ist.


[ExampleValidation]
    public class ExampleViewModel : NavigateToIndexViewModel
    {
        [Required(ErrorMessageResourceName = "Erforderlich_Hoehe", ErrorMessageResourceType = typeof(StringResources_WebAd3Web))]
        [Range(0, 440, ErrorMessageResourceName = "HoeheZuGross", ErrorMessageResourceType = typeof(StringResources_WebAd3Web))]
        public int HoeheInMM { get; set; }

und eine Methode, die mir die angegebenen Validationrules für das Model übergibt:


public ActionResult ExampleValidationRules() {
            var script = new StringBuilder();

            (from t in GetType().Assembly.GetTypes()
             where t.GetCustomAttributes(typeof(ExampleValidationAttribute), false).Count() > 0
             select t).ForEach(t =>
             {
                 ValidationVariableFor(t, script, RulesBezeichner, Rules);
                 ValidationVariableFor(t, script, MessagesBezeichner, ErrorMessages);
             });

            return JavaScript(script.ToString());
        }

der View sieht etwa wie foltg aus:


...
<%=Html.JjkJavaScript("~/Content/js/jquery.validate.js")%>
<script type="text/javascript" src="<%=Url.Action<ResourceController>(x=>x.ExampleValidationRules()) %>"></script>

<% using(Html.BeginForm<ExampleController>(x => x.Index(), FormMethod.Post, new {Id = Names.FormExample})) {%>

<div id="errors">
    <ul id="ExampleMessageBox"></ul>
</div>

<%= Html.TextBoxFor(x => x.HoeheInMM, new { style = "width:110px;" })%>
<%= Html.ValidationMessageFor(x => x.HoeheInMM) %>
<% } %> 

     <script type="text/javascript">
        $(document).ready(function () {
            $("#<%=Names.FormExample%>").validate({
                rules: ExampleViewModelRules,
                messages: ExampleViewModelMessages,
                errorLabelContainer: "#ExampleMessageBox",
                wrapper: "li"
            });
        });
    </script> 
...

Ich habe hier natürlich nur die wichtigen Parts abgebildet (könnte also sein, das ich den ein oder anderen syntaxfehler oder Fehlbenennungen übersehen hab - das ist im realen code allerdings nicht der fall).

Jetzt aber mal zum eigentlich Fehler.
Das Required-Attribute tut seinen Dienst, und zeigt eine Fehlermeldung an, wenn das entsprechende Textfeld leer ist - das erste Attribute funktioniert also einwandfrei.
Das Range-Attribute hingegen bereitet mir einige Kopfschmerzen, denn obwohl eine Range von 0 bis 440 angegeben ist, scheint diese Validierung nicht zu greifen - egal was ich eingebe, die Eingabe wird immer als nicht valid angesehen - negative Werte, Werte > 440, aber auch Werte die im Erlaubten bereich liegen, veranlassen, das die Fehlermeldung angezeigt wird.

Hat villeicht irgendwer eine Idee, woran das liegen könnte?

Danke schonmal für eure Hilfe!

MfG
Craze

//Edit\
Kleine Ergänzung zur Umgebung:
Visualstudio 2010
.Net Framework 4
Asp.NET MVC 3

C
Craze89 Themenstarter:in
52 Beiträge seit 2008
vor 12 Jahren

Ich hab den Fehler anscheinend gefunden und bin nur froh, das er so wie es aussieht nicht bei mir lag...

Anscheinend hat das Range-Attribute ein Problem mit der clientseitigen validierung, wesshalb ich mir einfach ein eigenes RangeValueAttribute geschrieben habe. Dazu dann die nötige neue Methode an den JQuery.Validate.Validator angehängt - und schon hats funktioniert!

Der Vollständigkeit wegen hier noch kurz der Code...

Das Attribute selbst:


[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
    public class RangeValueAttribute : ValidationAttribute
    {
        private readonly int minValue;
        private readonly int maxValue;
        
        public RangeValueAttribute(int minimum, int maximum) {
            minValue = minimum;
            maxValue = maximum;
        }

        public override bool IsValid(object value)
        {
            try
            {
                int valueAsInt = Convert.ToInt32(value);

                if (valueAsInt >= minValue && valueAsInt <= maxValue)
                {
                    return true;
                }
                return false;
            }
            catch (Exception)
            {
                return false;
            }
        }
    }

und der Code zum Anfügen der Methode an den Validator:


<script type="text/javascript">
$.validator.addMethod("rangevalue", function (value, element, param) {
        var minValue = "<%=Model.MinValue %>";
        var maxValue = "<%=Model.MaxValue %>";

        if (value > maxValue || value < minValue) {
            return false;
        }

        return true;
    })
</script>

MfG
Craze