2011-01-20 13 views
5

stworzyłem dziedziczoną cechę takiego w ASP.NET MVC3:Sprawdzanie poprawności po stronie klienta nie działa podczas dziedziczenia z RequiredAttribute w ASP.NET MVC 3?

public sealed class RequiredFromResourceAttribute : RequiredAttribute 
{ 
    public RequiredFromResourceAttribute(string errorResourceName, string errorResourceTypeName) 
    { 
     this.ErrorMessageResourceName = errorResourceName; 
     this.ErrorMessageResourceType = Type.GetType(errorResourceTypeName); 
    } 
} 

i używać go tak:

[RequiredFromResource("Title", "Resources.Resource, MyProject.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")] 
public string Title { get; set; } 

To nie działa i MVC zignorował. Następnie utworzyć klasę, która po prostu prostsze odziedziczoną RequiredAttribute tak:

public class MyRequiredAttribute : RequiredAttribute 
{ 
} 

używam go tak powiedziałem. Ale to już nie zadziałało.

Chociaż wszystkie te sposoby działają doskonale na "DisplayNameAtrribute".

Na czym polega problem?

+0

Moim zdaniem, odpowiedź Marcind radzi sobie z tym lepiej niż SkipHarris. RequiredAttributeAdapter w oknie Pomijanie wydaje się powodować walidację po stronie klienta, aby użyć zwykłego atrybutu Wymagany zamiast RequiredFromResourceAttribute. – Keerigan

Odpowiedz

3

Można rozwiązać ten problem, dodając następujący kod w Global.asax: (znaleziono odpowiedź here)

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredLocalizableAttribute), typeof(RequiredAttributeAdapter)); 

Alternatywnie, korzystając z rozwiązania marcind, znalazłem, że konstruktor dla ModelClientValidationRequiredRule wymaga komunikatu o błędzie. Oto zaktualizowana wersja, która zawiera nazwę wyświetlaną dla pola:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     string msg = FormatErrorMessage(metadata.GetDisplayName()); 
     yield return new ModelClientValidationRequiredRule(msg); 
    } 
+0

@ marcind's answer wydaje się radzić sobie z tym znacznie lepiej. Korzystanie z RequiredAttributeAdapter wydaje się wywoływać zwykły atrybut Wymagany zamiast niestandardowego. – Keerigan

+0

Pomiń odpowiedź, wydaje się działać dobrze dla mnie. Dzięki Skip. –

3

To tylko sprawdzanie poprawności po stronie klienta, które nie działa z atrybutami dziedziczonymi. Powodem tego jest to, że MVC stosuje ścisły typ równości przy odwzorowywaniu atrybutów po stronie serwera na zachowania sprawdzania poprawności klienta.

Aby obejść ten będzie potrzebny atrybut niestandardowy wdrożyć IClientValidatable:

public class MyRequiredAttribute : IClientValidatable { 
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { 
     yield return new ModelClientValidationRequiredRule(); 
    } 
} 
+1

Dlaczego więc ten sam sposób działa na MVC2!? –

+1

To jest o wiele lepszy sposób radzenia sobie z tym niż @SkipHarris. Korzystanie z RequiredAttributeAdapter wydaje się wywoływać zwykły atrybut Wymagany zamiast niestandardowego. – Keerigan

Powiązane problemy