gpt4 book ai didi

wcf - 如何在 Post Action 中使用 AutoMapper

转载 作者:行者123 更新时间:2023-12-02 06:39:33 27 4
gpt4 key购买 nike

在我的解决方案中,我有一个 ASP.NET MVC3 项目和一个使用数据库的 WCF 项目。我使用 entity framework self trackingAutoMapper 来映射对象。

我的问题是:如何将 AutoMapper 与 Post Action(如 crate 和 delete 以及 Edit 方法)一起使用

我看到这个Questions但帮不了我这给我一个错误 argument type '...' is not assignable to parameter type '...'

      [HttpPost]
public ActionResult Create(MUser muser)
{
if (ModelState.IsValid)
{
Mapper.CreateMap<User, MUser>();
var user = Mapper.Map<User, MUser>(muser);
_proxy.SaveUser(user);
return RedirectToAction("Index");

}
return View(muser);
}

enter image description here

最佳答案

您不应该将 Mapper.CreateMap 放在您的 Controller 中,您只需执行一次该操作,因此创建一个 Bootstrap 或类似的东西并从您的应用程序启动方法中调用它。

我认为这就是您的错误来源:您只能创建一次映射。

哦,您定义了错误的类型。您并不是要将 User 转换为 MUser,而是相反,因此应该是:

Mapper.CreateMap<MUser, User>();
Mapper.Map<MUser, User>(muser);

如何执行此操作的示例:

public class MvcApplication : HttpApplication
{
// some methods

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);

MappingsBootstrapper.Initialize(); // call the bootstrap class that I created
}
}

然后我有一个名为“Mappings”的项目,它包含引导类和一些“配置”类(就像 Entity Framework 有 EntityTypeConfiguration 类而 Ninject 有 NinjectModules):

public static class MappingsBootstrapper
{
public static void Initialize()
{
new UserMappings();
new BookcaseItemMappings();
}
}

和映射:

class UserMappings
{
public UserMappings()
{
Mapper.CreateMap<User, UserSetupViewModel>();
Mapper.CreateMap<UserSetupViewModel, User>();
}
}

class BookcaseItemMappings
{
public BookcaseItemMappings()
{
Mapper.CreateMap<NewBookViewModel, BookcaseItem>().ForMember(x => x.BookId, opt => opt.Ignore());
Mapper.CreateMap<BookcaseItem, BookcaseItemViewModel>()
.ForMember(x => x.Title, opt => opt.MapFrom(src => src.Book.Title))
.ForMember(x => x.Authors, opt => opt.MapFrom(src => src.Book.Authors.Select(x => x.Name).Aggregate((i, j) => i + ", " + j)))
.ForMember(x => x.Identifiers, opt => opt.MapFrom(src => (!string.IsNullOrEmpty(src.Book.Isbn10) ? ("ISBN10: " + src.Book.Isbn10 + "\r\n") : string.Empty) +
(!string.IsNullOrEmpty(src.Book.Isbn13) ? ("ISBN13: " + src.Book.Isbn13) : string.Empty)))
.ForMember(x => x.Pages, opt => opt.MapFrom(src => src.Book.Pages))
.ForMember(x => x.ImageUri, opt => opt.MapFrom(src => src.Book.ThumbnailUriSmall));
}
}

您可以按照自己喜欢的方式进行,您可以将所有映射放在 Application_Start() 方法中,但我发现这是一种干净且可维护的方式。

关于wcf - 如何在 Post Action 中使用 AutoMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10700620/

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