Asp.net mvc 2 Html.DropDownList自动映射问题

Asp.net mvc 2 Html.DropDownList自动映射问题,asp.net-mvc-2,automapper,Asp.net Mvc 2,Automapper,我收到这个错误: 具有键“DepartmentId”的ViewData项的类型为“System.Int32”,但必须为“IEnumerable”类型 使用以下设置。我不知道如何解决它。错误发生在模型视图代码中。此行:public void MapTo(Person domainModel)。我正在使用AutoMapper将ViewModel映射回DomainModel(反转DomainModel到ViewModel的初始映射) 域模型(使用LINQ to SQL,因此这是一个分部类): 这是我的

我收到这个错误:

具有键“DepartmentId”的ViewData项的类型为“System.Int32”,但必须为“IEnumerable”类型

使用以下设置。我不知道如何解决它。错误发生在模型视图代码中。此行:public void MapTo(Person domainModel)。我正在使用AutoMapper将ViewModel映射回DomainModel(反转DomainModel到ViewModel的初始映射)

域模型(使用LINQ to SQL,因此这是一个分部类):

这是我的模型视图:

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);
    }
}
控制器类别代码:

[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);
    }                      
} 
和我的视图HTML代码:

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

型号.部门ID)%>

您没有真正遵循开发mvc应用程序的最佳实践

关于错误: Html.DropDownList在模型中查找类型为
IEnumerable
的数据,但找到的却是
int
DepartmentId

您的ViewModel不应该使用MapTo方法,它违反了单一责任原则

在action方法中,您不会执行任何服务器端验证,如:

if(!ModelState.IsValid)
{
   //rebuild the viewmodel and return the view
}
捕捉行动中的一切也是不必要的(而且很糟糕) 您可以在
Global.asax应用程序\u Error
中执行此操作

HiddenInput、ScaffoldColumn、Validation和任何其他与UI相关的属性都应该在ViewModel上,而不是在域模型中

对于使用视图模型以及验证和映射实体视图模型的良好示例,我建议您查看

我做了这个示例,它的主要目的是演示(映射技术)的使用

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