Question

Les propriétés héritées et MetadataType ne semblent pas fonctionner avec la validation côté client dans ASP.NET MVC 2.

La validation de nos MetadataTypes fonctionne comme prévu sur le serveur mais pour une raison quelconque, elle ne génère pas les scripts clients appropriés.La validation côté client démarre comme prévu pour les propriétés avec les attributs DataAnnotations définis sur PersonView. Je sais donc que la validation côté client est active et qu'elle fonctionne. Est-ce que quelqu'un sait si et comment cela peut être réparé ?

Voici ce que nous avons :

public abstract class PersonView
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    [Required] public string PhoneNumber { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
    public string AddressZipCode { get; set; }
    public string AddressCity { get; set; }
    public string AddressCountry { get; set; }
}

[MetadataType(typeof(CustomerViewMetaData))]
public class CustomerView : PersonView {}

[MetadataType(typeof(GuestViewMetaData))]
public class GuestView : PersonView {}

public class GuestViewMetaData
{
    [Required(ErrorMessage = "The guests firstname is required")] public string FirstName { get; set; }
    [Required(ErrorMessage = "The guests lastname is required")] public string LastName { get; set; }
}

public class CustomerViewMetaData
{
    [Required(ErrorMessage = "The customers firstname is required")] public string FirstName { get; set; }
    [Required(ErrorMessage = "The customers lastname is required")] public string LastName { get; set; }
    [Required(ErrorMessage = "The customers emails is required")] public string Email { get; set; }
}

Comme vous pouvez le voir, il n'y a rien d'extraordinaire ou d'étrange là-dedans...Est-ce que ça peut être réparé ? Est-ce un bug dans ASP.NET MVC 2 ?

Était-ce utile?

La solution

Selon un responsable Microsoft ce bogue dans ASP.NET MVC 2 . On m'a donné le lien ci-dessous et bien que le scénario n'est pas exactement la même chose, il semble être le même problème. Pour autant que je peux dire qu'il est lié aux propriétés inhertited et DataAnnotations fournisseur de métadonnées de modèle. Le lien dit qu'ils vont essayer de résoudre le problème dans ASP.NET MVC 3.

Asp.net MVC 2 RC2: la validation du côté client ne fonctionne pas avec les propriétés surchargées

Autres conseils

Il est peut-être trop tard mais c'est ainsi que j'ai réussi à résoudre ce bug.
J'ai créé un fournisseur de métadonnées de modèle personnalisé qui hérite de DataAnnotationsModelMetadataProvider et remplacer le Créer des métadonnées méthode.Le problème est que la valeur dans Type de conteneur Le paramètre pointe vers la classe de base au lieu de pointer vers la classe héritée.Voici le code

public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(
        IEnumerable<Attribute> attributes, 
        Type containerType, 
        Func<object> modelAccessor, 
        Type modelType, 
        string propertyName)
    {

        if (modelAccessor != null && containerType != null)
        {                
            FieldInfo container = modelAccessor.Target.GetType().GetField("container");
            if (containerType.IsAssignableFrom(container.FieldType))
                containerType = container.FieldType;
        }

        var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);



        return modelMetadata;
    }
}

Et enfin, nous devons enregistrer ce fournisseur de métadonnées personnalisé dans Global.asax à Application_Start

ModelMetadataProviders.Current = new CustomModelMetadataProvider();

Désolé pour mon anglais!

Êtes-vous sûr? J'ai un site ASP.NET MVC 2 mis en place que vous décrivez et je validation côté client des deux attributs requis et en fonction regex qui fonctionne bien. Il ne fonctionne pas avec mes propres validateurs (qui dérivent de ValidationAttribute) au moment même:

[MetadataType(typeof(AlbumMetadata))]
public partial class Album {}

public class AlbumMetadata {
    [Required(ErrorMessage = "You must supply a caption that is at least 3 characters long.")]
    [MinLength(3, ErrorMessage = "The caption must be at least {0} characters long.")]
    [RegularExpression(@".{3,}")]
    public string Caption { get; set; }
}

(MinLength fournit essentiellement une manière plus évidente pour voir ce qui se passe dans l'attribut d'expression régulière, qui a été ajouté pour les tests)

J'ai alors ce qui suit à mon avis:

<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>

<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm()) {%>
<fieldset>
    <legend>Album details</legend>
    <div class="form_row">
        <label for="Caption" class="left_label">Album caption:</label>
        <%= Html.TextBox("Caption", Model.Caption, new { @class = "textbox" })%>
        <%= Html.ValidationMessage("Caption", "*") %>
        <div class="cleaner">&nbsp;</div>
    </div>
    <div class="form_row">
        <label for="IsPublic" class="left_label">Is this album public:</label>
        <%= Html.CheckBox("IsPublic", Model.IsPublic) %>
    </div>
    <div class="form_row">
        <input type="submit" value="Save" />
    </div>
</fieldset>
<% } %>

Ce qui se traduit par la sortie suivante étant au client ci-dessous les balises de formulaire (format pour plus de clarté):

<script type="text/javascript">
//<![CDATA[
if (!window.mvcClientValidationMetadata)
{ window.mvcClientValidationMetadata = []; }
window.mvcClientValidationMetadata.push({
    "Fields":[
      {"FieldName":"Caption",
       "ReplaceValidationMessageContents":false,
       "ValidationMessageId":"Caption_validationMessage",
       "ValidationRules":[
         {"ErrorMessage":"You must supply a caption that is at least 3 characters long.",
          "ValidationParameters":{},
          "ValidationType":"required"},
         {"ErrorMessage":"The field Caption must match the regular expression \u0027.{3,}\u0027.",
          "ValidationParameters":{"pattern":".{3,}"},
          "ValidationType":"regularExpression"}]
      }],
      "FormId":"form0","ReplaceValidationSummary":false});
//]]>
</script>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top