【问题标题】:Html.DropDownList AutoMapper problemHtml.DropDownList AutoMapper 问题
【发布时间】:2010-08-25 09:02:01
【问题描述】:

我收到此错误:

具有键“DepartmentId”的 ViewData 项属于“System.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);
    }                      
} 

还有我的 View HTML 代码:

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

【问题讨论】:

    标签: asp.net-mvc-2 automapper


    【解决方案1】:

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

    关于错误: Html.DropDownList 在模型中查找 IEnumerable&lt;SelectListItem&gt; 类型的数据,但它找到了 int (DepartmentId)

    你的 ViewModel 不应该有 MapTo 方法,它违反了单一职责原则

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

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

    在行动中捕捉一切也不是必要的(而且不好) 你可以在Global.asax Application_Error 中执行此操作

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


    对于在 entity viewmodel 之间使用 viewmodels & validation & mapping 的良好示例,我建议您查看来自 here 的 Samples 解决方案

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多