2010-08-25 4 views
3

Je reçois cette erreur:Html.DropDownList problème AutoMapper

The ViewData item that has the key 'DepartmentId' is of type 'System.Int32' but must be of type 'IEnumerable'.

la configuration suivante. Je ne suis pas sûr de savoir comment le résoudre. L'erreur se produit dans le code de vue modèle. Cette ligne: public void MapTo (Person domainModel). J'utilise AutoMapper pour mapper ViewModel à DomainModel (en inversant le mappage initial de DomainModel à ViewModel).

modèle de domaine (en utilisant LINQ to SQL, donc c'est une classe partielle):

public partial class Person { } 

// Validation rules 
public class Person_Validation 
{ 
    [HiddenInput(DisplayValue = false)] 
    [ScaffoldColumn(false)] 
    public object PersonId { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    [ScaffoldColumn(false)] 
    public object DepartmentId { get; set; } 

    [DisplayName("Employee Name")] 
    [Required(ErrorMessage = "Employee Name is required")] 
    [StringLength(50, ErrorMessage = "Employee Name cannot be more than 50 characters")] 
    public object Name { get; set; } 

    [HiddenInput(DisplayValue = false)]   
    public object Active { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    public object DateAdded { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    public object DateDeleted { get; set; } 

    public object Department { get; set; }  
} 

Ceci est mon modèle Vue:

public class PersonViewModel 
{  
    public object PersonId { get; set; } 

    public object DepartmentId { get; set; } 

    public object Name { get; set; } 

    public object Active { get; set; } 

    public object DateAdded { get; set; } 

    public object DateDeleted { get; set; }  

    public object DepartmentName { get; set; } 

    //helper method 
    public void MapTo(Person domainModel) 
    { 
     Mapper.Map(this, domainModel); 
    } 
} 

Contrôleur Classe Code:

[HttpPost]   
public ActionResult Edit(PersonViewModel viewModel) 
{ 
    var domainModel = new Person();          
    try      
    {      
     viewModel.MapTo(domainModel); 
     UpdateModel(domainModel); 
     _personRepository.Save(); 
     return RedirectToAction("Index", "Person"); 
    }      
    catch     
    {      
     return View(viewModel); 
    }      
} 

Et mon code HTML Voir:

<div class="editor-field">     
<%: Html.DropDownList("DepartmentId", (IEnumerable<SelectListItem>)ViewData["DepartmentList"])%>          
<%: Html.ValidationMessageFor(model => model.DepartmentId) %> 
</div> 

Répondre

0

vous ne suivez pas vraiment les meilleures pratiques de développement d'une application mvc.

A propos de l'erreur: la Html.DropDownList recherche des données de type IEnumerable<SelectListItem> dans le modèle, mais il trouve une place int (DepartmentId)

votre ViewModel ne devrait pas avoir la méthode MapTo, il rompt le principe de responsabilité unique

dans votre méthode d'action que vous ne faites pas la validation du côté serveur comme:

if(!ModelState.IsValid) 
{ 
    //rebuild the viewmodel and return the view 
} 

attraper tout en un ction est pas nécessaire (et mauvais) vous faites cela dans Global.asax Application_Error au lieu

attributs tels que HiddenInput, ScaffoldColumn, validation et toute autre interface utilisateur devraient être inscrites sur vous viewmodel pas dans votre modèle de domaine


pour une bonne échantillon d'utiliser ViewModels & validation & cartographie entre entité < -> viewmodel Je vous recommande de regarder la solution des échantillons de here

J'ai fait cet échantillon et son but principal est de démontrer l'utilisation de ValueInjecter (technologie de cartographie)