gpt4 book ai didi

asp.net-mvc-2 - Html.DropDownList AutoMapper 问题

转载 作者:行者123 更新时间:2023-12-01 19:44:17 27 4
gpt4 key购买 nike

我收到此错误:

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

进行以下设置。我不知道如何解决它。该错误发生在模型 View 代码中。这一行: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; }
}

这是我的模型 View :

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

以及我的 View HTML 代码:

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

最佳答案

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

关于错误:Html.DropDownList 查找 IEnumerable<SelectListItem> 类型的数据在模型中,但它找到了 int相反(DepartmentId)

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

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

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

捕捉 Action 中的所有内容也没有必要(而且不好)你在 Global.asax Application_Error 中执行此操作相反

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


有关在实体<-> View 模型之间使用 View 模型、验证和映射的良好示例,我建议您查看 here 中的示例解决方案

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

关于asp.net-mvc-2 - Html.DropDownList AutoMapper 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3564275/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com