代码之家  ›  专栏  ›  技术社区  ›  obautista

Html.DropDownList下载自动映射问题

  •  4
  • obautista  · 技术社区  · 14 年前

    我收到这个错误:

    具有键'DepartmentId'的ViewData项的类型为'系统.Int32'但必须是'IEnumerable'类型。

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

    域模型(使用LINQ to 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);
        }
    }
    

    [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>
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   Omu    14 年前

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

    关于错误: IEnumerable<SelectListItem> 但它发现 int 相反( DepartmentId )

    ViewModel不应该有MapTo方法,它打破了单一责任原则

    在操作方法中,不执行任何服务器端验证,如:

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

    在行动中抓住一切也不是必要的(而且是不好的) 你这样做是为了 Global.asax Application_Error

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


    作为一个很好的例子 之间 我建议你看看溶液样品 here

    ValueInjecter (测绘技术)