2011-10-19 3 views
2

J'utilise asp.net MVC3 avec le mot frame Enitity. les deux communiquent via le service Web WCF. Le problème est que, du côté serveur, les développeurs DB ne veulent pas définir les attributs [Required]/[Range] sur la propriété dans leurs classes Entity. Mais je veux valider le champ à ma fin dans l'application mvc3. où j'ai ajouté la référence de service web WCF. qui a généré un proxy. Je ne souhaite pas utiliser Jquery/javascript conformément à la politique du client. donc je dois le faire à mon niveau de contrôleur/modèle. comment gérer cela? certains comment j'ai besoin d'ajouter dynamiquement l'attribut requis aux propriétés de chaque entité à partir de mvc 3 aaplication. besoin de la bonne direction pour accélérer.Validation côté serveur dans asp.net MVC 3 avec cadre d'entité

Oublié d'ajouter: Db développeur striclty éviter à l'utilisateur nécessaire. aussi db pas généré dans l'entité et les mappages.

Répondre

2

Vous devez write a code to validate your entities. Même si les développeurs utilisaient ces attributs sur des entités, vous ne les auriez pas à vos côtés, car vous accédez au DAL via le proxy généré par WCF et ces attributs ne sont pas générés par l'outil de votre côté.

Toutes les classes générées par l'ajout d'une référence de service doivent être partielles afin que vous puissiez ajouter votre partie partielle personnalisée et implémenter la validation (en implémentant l'interface IValidatableObject).

2

Je suis d'accord avec Ladislav Mrnka mais si vous n'êtes pas en mesure de modifier les propriétés de la classe d'entité, vous devez la source dehors:

[MetadataType(typeof(YourOwnClassForValidation))] 
public partial class ClassOfYourDbDeveloper 
{ 
    // db developer doesn't allow you to change this 
    public string Title { get; set; } 
} 

public class YourOwnClassForValidation 
{ 
    // here you can use your data annotations 
    // important to use object 
    [Required] 
    public object Title { get; set; } 
} 

Il est juste pour définir les propriétés, en savoir plus sur ce ici en bas: http://www.asp.net/mvc/tutorials/validation-with-the-data-annotation-validators-cs

+0

Ok donc je peux ajouter des attributs aux propriétés des objets existants dans Proxy en utilisant la classe partielle. cela me permettra-t-il? –

+0

Je ne suis pas sûr de votre proxy mais vous pouvez utiliser l'attribut '[MetadataType (typeof (YourOwnClassForValidation))]' pour définir une classe dans laquelle les attributs de validation sont définis sur les propriétés. C'est utile si vous avez une classe d'entité générée automatiquement qui changera la prochaine fois que vous utiliserez le concepteur comme exemple. – Marc

1

Vous pouvez enregistrer une classe à utiliser comme fournisseur de métadonnées/validation pour vos modèles.

Avoir votre entité, qui ne peut être changé:

public class MyModel 
{ 
    public int IntProperty { get; set; } 

    public DateTime DateProperty { get; set; } 
} 

Vous pouvez avoir ses métadonnées sur le côté MVC, que vous pouvez valider et fournir des métadonnées comme si elle est la classe d'origine:

[ValidationAttribute(...)] 
[ValidationAttribute(...)] 
public class MyModelValidator 
{ 
    [Required] 
    [Display("My Integer")] 
    public int IntProperty { get; set; } 

    [DataType(DataType.DateTime)] 
    public DateTime DateProperty { get; set; } 
} 

Enfin, il suffit d'attacher la classe Metadata/Validator à la classe de base correspondante, par exemple sur Global.asax:

protected void Application_Start() 
{ 
    AssociatedMetadataTypeTypeDescriptionProvider typeDescriptionProvider; 

    typeDescriptionProvider = new AssociatedMetadataTypeTypeDescriptionProvider(
      typeof(MyModel), 
      typeof(MyModelValidator)); 

    TypeDescriptor.AddProviderTransparent(typeDescriptionProvider, typeof(MyModel)); 

    // register other metadata classes 
} 

Vous pouvez le faire pour chaque entité que vous voulez.

1

Utiliser les modèles de vue. L'un de leurs objectifs est de faire abstraction des objets du modèle (comme M dans MVC) à partir des vues. Mettez les attributs de validation dans vos modèles de vue et utilisez un mappeur (comme automapper) pour copier des informations vers/depuis les entités db.

Utilisez ModelState.IsValid dans les actions de votre contrôleur pour vérifier si les modèles de vue sont valides.

Mes méthodes d'action postage généralement someting liek ceci:

[HttpPost] 
public virtual ActionResult Edit(EditModel model) 
{ 
    if (!ModelState.IsValid) 
     return View(model); 

    try 
    { 
     // fetch db entity 
     var template = _templateService.Get(model.Id); 

     // copy info from view model to db entity 
     Mapper.Map(model, template); 

     // save db entity 
     templateService.Save(template); 

     return RedirectToAction("Details", new { id = template.Id }); 
    } 
    catch (Exception err) 
    { 
     Logger.Error("Failed to save template", err); 
     ModelState.AddModelError("", err); 
     return View(model); 
    } 
} 
Questions connexes