2010-12-13 39 views
0

Salut,Formulaire à vue de modéliser des problèmes (AutoMapping)

Je construis une application ASP.NET MVC et ont un problème avec le traitement des données.

Un de mes actions ressemble à ceci:

public ActionResult Register(int categoryId, int? filterId) 

Cette action instansiate le formulaire d'inscription et dans ce cas, cela signifie pour charger une coutume viewmodel objet avec des données de DB (Entity Framework) et envoyer à la vue fortement typée.

Pour translater l'objet du module à l'objet de vue J'utilise AutoMapper

Lorsque l'utilisateur a modifié les données et cliquez sur soumettre l'action followin sera déclenchée:

[CustomAuthorize(Roles = SiteRoles.Admin)] 
     [AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Register(ModelViewRegisterFilter filter) 

Cette action se déroulera le code suivant:

 if(filter.EditingFilter.Id > 0) 
      adCategoryFilter = Mapper.Map<RegisterFilterItem, AdCategoryFilter>(filter.EditingFilter, filterModel.GetFilter(filter.EditingFilter.Id)); 
     else 
      adCategoryFilter = Mapper.Map<RegisterFilterItem, AdCategoryFilter>(filter.EditingFilter); 

Le filtre adCategoryFilter est une classe de Model (db). Lorsque cela est fait, il ne devrait pas y avoir de problème pour sauvegarder l'objet de modèle d'entité (adCategoryFilter).

Problème 1 J'ai un champ dans la table db caled DisplayCheckBox et est de type Nullable tinyint. Pour représenter ceci j'ai créé un bool Nullable dans mon objet de vue. Lorsque vous utilisez le AutoMapper de traduire à partir du modèle au MODELVIEW je reçois l'exception suivante:

Essayer de carte System.Byte à System.Nullable`1 [[System.Boolean, mscorlib, Version = 4.0. 0,0, Culture = neutre, PublicKeyToken = b77a5c561934e089]]. Utilisation de la configuration de la cartographie pour Biss.Models.Model.AdCategoryFilter à Biss.Views.ViewClasses.RegisterFilterItem propriété Destination: DisplayCheckBox exception de type 'AutoMapper.AutoMapperMappingException' a été levée.

Je cheked la propriété généré de la classe modèle et ressembler à ceci:

Nullable<global::System.Byte> 

Problème 2 Lorsque le formulaire est soumis l'objet viewmodel sera rempli de données du formulaire . S'il y a un textBox qui a la valeur "" (string.empty) alors la chaîne sera définie à null.

Le champ db qui représente cette zone de texte est de type nchar (100) et il est généré par l'infrastructure d'entité en une chaîne. Le problème est que automapper essayera de définir la valeur null à la propriété DisplayTextBox sur l'objet de modèle et qui lancera l'exception suivante:

Cette propriété ne peut pas être définie sur une valeur nulle.

Avis de consultation.

Répondre

1

1) Automapper ne fait aucune conversion implicite pour vous. Vous devrez spécifier comment convertir cette valeur en utilisant l'un des automappers extensibility points.

En réponse au commentaire. Ce test lèvera une exception:

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     Mapper.CreateMap<HasByte, HasBool>(); 

     var hasByte = new HasByte() { Value = 1 }; 

     var hasBool = Mapper.Map<HasByte, HasBool>(hasByte); 
    } 
} 

public class HasByte 
{ 
    public Nullable<Byte> Value { get; set; } 
} 

public class HasBool 
{ 
    public Nullable<bool> Value { get; set; } 
} 

2) Ne définissez pas une propriété qui ne peut pas être nulle à null. Utilisez l'attribut [Bind] pour ignorer cette propriété ou vérifiez la valeur de formulaire affiché pour null avant d'essayer de lier le modèle. Voici un article décent sur l'utilisation de l'attribut Bind:

http://ittecture.wordpress.com/2009/05/01/tip-of-the-day-199-asp-net-mvc-defining-model-binding-explicitly/

+0

En fait, votre point au sujet Automapper est incorrect. Tout ce qu'il doit faire est d'appeler CreateMap avant d'appeler Map. – rboarman

+0

C'est bizarre. J'ai utilisé AM partout sans avoir à faire quelque chose de spécial. – rboarman

+0

Cela génère de nouvelles questions 1 = Si j'utilise l'attribut Bind et exclut certaines propriétés, comment cela fonctionnera-t-il lors de l'utilisation d'AutoMapper pour mapper le ViewObject à DataModelObject? Je suppose que les données "réelles" de la base de données (DataModelObject) seront remplacées par les propriétés non définies de ViewObject? – Banshee