2010-08-25 5 views
3

Я получаю эту ошибку:проблема Html.DropDownList AutoMapper

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

со следующей настройкой. Я не уверен, как его решить. Ошибка происходит в коде модели. Эта строка: public void MapTo (Person domainModel). Я использую AutoMapper для отображения ViewModel обратно в DomainModel (изменение исходного отображения DomainModel на ViewModel).

модель домена (с помощью LINQ к SQL, так что это частичный класс):

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; }  
} 

Это моя модель Вид:

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); 
    } 
} 

Controller Код класса:

[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); 
    }      
} 

And my Показать код HTML:

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

ответ

0

Вы действительно не следуете лучшим методам разработки приложения mvc.

об ошибке: Html.DropDownList ищет данные типа IEnumerable<SelectListItem> в модели, но она находит int вместо (DepartmentId)

вашего ViewModel не должен иметь метода МАПТА, он ломает единый принцип ответственности

в методе действий вы не делать каких-либо на стороне сервера проверки, как:

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

ловить все в а фикция тоже не надо (и плохой) вы делаете это в Global.asax Application_Error вместо

атрибуты, такие как HiddenInput, ScaffoldColumn, санкционирование и все остальное UI связанного должны быть на вас ViewModel не в вашей доменной модели


для хорошего пример использования ViewModels & проверки & отображения между объектом < -> ViewModel Я рекомендую вам взглянуть на решении образцов из here

Я сделал этот образец, и его основная цель - продемонстрировать использование ValueInjecter (технология отображения)

Смежные вопросы