Erforderliches Attribut für den BOOL -Werttyp bei Verwendung als Kontrollkästchen
-
18-09-2019 - |
Frage
Ich stehe auf ein Problem, bei dem ich ein einfaches Formular hinzufügen/bearbeiten und die clientseitige Validierung (jQuery/microsoftMVCJQueryValidation.js) habe, die aus Datenanmerkungen generiert und Client-Seite aktiviert wird, indem ich in meiner Ansicht Folgendes aufruft:
<% Html.EnableClientValidation(); %>
Dies scheint für die meisten Elemente einwandfrei zu funktionieren, aber ich habe eine Instanz, in der ich eine boolesche Eigenschaft habe, die als Kontrollkästchen verwendet wird:
<%= Html.EditorFor(model => model.Chargeable)%>
Das kann entweder wahr/falsch sein (krank/ungezwungen).
Da der BOOL ein Werttyp ist und nicht nullbar ist, wird es als erforderliche Eigenschaft gerendert und zeigt einen Fehler (Client -Seite) an, wenn das Formular eingereicht wird. Lesen Sie "Das Gebühren für das Feld ist erforderlich". generiert ist zwei Teil (sowohl das Kontrollkästchen als auch den versteckten Wert), es wird die Post -Back -Validierung übergeben.
Nach dem Durchsuchen des MVC 2 -Quellcodes habe ich es geschafft, momentan ein "schnelles und schmutziges" Fix einzulegen, das festgelegt werden soll:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
Hat noch jemand Ideen oder Vorschläge dafür bekommen, wie ich das umgehen kann?
IMO, ich glaube nicht, dass MVC den Client-Side-erforderlichen Validator für Kontrollkästchen einstellen sollte, die mit den Methoden html.editorfor/html.checkbox (für) gerendert werden.
Hinweis: Ich verwende den ASP.NET MVC 2 RC2 und die MicrosoftMVCJQueryValidation.js aus der passenden MVC -Futures -Version.
Lösung
Ich nehme an, der einfachste Weg zum Umgang ist es, die Funktionen der Regeln ("entfernen", [Regeln]) auf den Elementen (hauptsächlich Kontrollkästchen) aufzurufen, aus denen ich die clientseitige Validierung entfernen möchte:
<script type="text/javascript">
$(document).ready(function() {
$('#Chargeable').rules('remove', 'required');
});
</script>