Jeśli mam deklarację [Required(AllowEmptyStrings = true)]
w moim modelu widoku, walidacja jest zawsze wyzwalana na pustych wejściach. Znalazłem the article, co wyjaśnia, dlaczego tak się dzieje. Czy wiesz, czy jest dostępna poprawka? Jeśli nie, jak sobie z tym radzisz?RequiredAttribute z AllowEmptyString = true w dyskretnej walidacji ASP.NET MVC 3
Odpowiedz
Uwaga: Zakładam, że masz AllowEmptyStrings = true, ponieważ używasz również modelu widoku poza scenariuszem sieciowym; w przeciwnym razie nie wydaje się, aby było dużo sensu posiadanie wymaganego atrybutu, który zezwala na puste ciągi w scenariuszu internetowym.
Istnieją trzy kroki, aby sobie z tym poradzić:
- Tworzenie adapter niestandardowy atrybut, który dodaje, że parametr walidacji
- Zarejestruj swoją kartę jako fabryki adaptera
- przesłonić jQuery Validation funkcjonować w celu umożliwienia pusty ciągi, gdy atrybut ten jest obecny
Krok 1: niestandardowy adapter atrybutów
zmodyfikowałem RequiredAttributeAdapter do dodania w tej logiki:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
namespace CustomAttributes
{
/// <summary>Provides an adapter for the <see cref="T:System.Runtime.CompilerServices.RequiredAttributeAttribute" /> attribute.</summary>
public class RequiredAttributeAdapter : DataAnnotationsModelValidator<RequiredAttribute>
{
/// <summary>Initializes a new instance of the <see cref="T:System.Runtime.CompilerServices.RequiredAttributeAttribute" /> class.</summary>
/// <param name="metadata">The model metadata.</param>
/// <param name="context">The controller context.</param>
/// <param name="attribute">The required attribute.</param>
public RequiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute)
: base(metadata, context, attribute)
{
}
/// <summary>Gets a list of required-value client validation rules.</summary>
/// <returns>A list of required-value client validation rules.</returns>
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
var rule = new ModelClientValidationRequiredRule(base.ErrorMessage);
if (base.Attribute.AllowEmptyStrings)
{
//setting "true" rather than bool true which is serialized as "True"
rule.ValidationParameters["allowempty"] = "true";
}
return new ModelClientValidationRequiredRule[] { rule };
}
}
}
Krok 2. Rejestr ten w swoim global.asax/Application_Start()
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
DataAnnotationsModelValidatorProvider.RegisterAdapterFactory(typeof(RequiredAttribute),
(metadata, controllerContext, attribute) => new CustomAttributes.RequiredAttributeAdapter(metadata,
controllerContext, (RequiredAttribute)attribute));
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
Krok 3. Zastąp jQuery "wymagana" funkcja sprawdzania poprawności
Odbywa się to za pomocą wywołania jQuery.validator.addMethod(), dodając naszą niestandardową logikę, a następnie wywołując oryginalną funkcję - możesz przeczytać więcej o tym podejściu here. Jeśli używasz tego w swojej witrynie, być może w pliku skryptowym wymienionym w twoim _Layout.cshtml. Oto blok przykładowy skrypt można upuścić na stronie do testu:
<script>
jQuery.validator.methods.oldRequired = jQuery.validator.methods.required;
jQuery.validator.addMethod("required", function (value, element, param) {
if ($(element).attr('data-val-required-allowempty') == 'true') {
return true;
}
return jQuery.validator.methods.oldRequired.call(this, value, element, param);
},
jQuery.validator.messages.required // use default message
);
</script>
Zamiast dekoracji wartość za pomocą atrybutu „wymagane”, używam następujące. Uważam, że jest to najprostsze rozwiązanie tego problemu.
[DisplayFormat (ConvertEmptyStringToNull = false)]
Zgadzam się - wydaje się to najłatwiejszym sposobem na rozwiązanie tego problemu. Jeśli chcesz zezwolić na puste ciągi, po prostu zmień zerową wartość null na "" w kontrolerze przed zapisaniem! –
Piękne! To cofnięcie [Wymagane] drażniło mnie od lat na wielu stronach asp.net (teraz używam obu [Wymagane (AllowEmptyStrings = true), DisplayFormat (ConvertEmptyStringToNull = false)] i to działa świetnie –
Świetna odpowiedź. Bardzo dziękuję –
- 1. Sprawdzanie poprawności po stronie klienta nie działa podczas dziedziczenia z RequiredAttribute w ASP.NET MVC 3?
- 2. Asp.net MVC 3 Warunkowe walidacja z DataAnnotations
- 3. Korzystanie z Microsoft.VisualBasic.Logging.FileLogTraceListener z ASP.NET MVC 3
- 4. ACL w ASP.NET MVC 3
- 5. @ Html.ActionLink w ASP.NET MVC 3
- 6. ASP.NET MVC 3 Viewmodel Pattern
- 7. ASP.NET MVC 3 Generic DisplayTemplates
- 8. asp.net mvc 3 pobierz wyjątek
- 9. ASP.NET MVC 3 ViewModel danych Adnotacje
- 10. Możliwy błąd z routingiem ASP.NET MVC 3?
- 11. ASP.NET MVC 3 _Layout.cshtml Kontroler
- 12. Uwierzytelnianie użytkowników ASP.NET MVC 3
- 13. Projekt ASP.NET MVC 3 nie będzie kompilowany na serwerze kompilacji z zainstalowanym programem ASP.NET MVC 3
- 14. Aktualizowanie ASP.NET MVC 3 projektu do ASP.NET MVC 4
- 15. ASP.NET MVC 3 plany książek
- 16. Autoryzacja niestandardowa w ASP.NET MVC 3
- 17. Widoki częściowe Buforowanie w ASP.NET MVC 3
- 18. Warstwa walidacji w wzorcu MVC
- 19. Zastępowanie/dezaktywowanie autoryzacji w ASP.NET MVC 3
- 20. Hasło DataAnnotation w ASP.NET MVC 3
- 21. Autoryzacja poziomu danych w ASP.Net MVC 3
- 22. Dodawanie nagłówków w ASP.NET MVC 3
- 23. MVC 3 dyskretne walidacji - warunkowo wyłączyć/włączyć zatwierdzanie
- 24. MVC 3 dziesiętny Problem walidacji po stronie serwera
- 25. ASP.Net MVC 3 Odzyskaj wartości listy checkbox
- 26. Wtyczka walidacji jQuery w ASP.NET Web Forms
- 27. ASP.NET MVC ModelMetaData: Czy istnieje sposób ustawić IsRequired na podstawie RequiredAttribute?
- 28. asp.net mvc 3 zdalny atrybut przechodzący 3 pola
- 29. ASP.NET MVC Dyskretna weryfikacja klienta nie działa
- 30. Brzytwa ASP.NET MVC 3: Inicjowanie tablicy JavaScript
Dzięki za starania, Jon! Niestety nie działa to dla mnie, wciąż widzę komunikat "pole jest wymagane" :(Sprawdziłem dwukrotnie, czy twój kod jest wykonywany z VS i debuggery przeglądarki i nie mam żadnych niestandardowych skryptów lub kodu związanego z walidacją, które mogłyby przeszkadzać. jQuery 1.4.1 Czy to może być problem? – UserControl
I tak, masz rację, że potrzebuję tej funkcji poza scenariuszami sieci (moja warstwa usługi aplikacji wykonuje podobne testy sprawdzania poprawności, aby być DRY) – UserControl
+1 To wydaje się być fajne rozwiązanie, zastanawiam się, dlaczego to nie działa.Ale może można go uprościć, jeśli nie zwróci żadnej zasady sprawdzania poprawności (pusta tablica) w adapterze w przypadku AllowEmptyStrings.Możesz następnie oszczędzić magii po stronie klienta.Możesz następnie łatwo sprawdź czy wymagany atrybut jest poprawnie pominięty na twoim wejściu.Jeśli nadal nie działa, powinieneś debugować kod adaptera i sprawdzić, czy jest on odpowiednio nazwany (jeśli rejestracja jest OK). –