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
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