Asp.net mvc 自动映射,在控制器上创建操作。困惑的

Asp.net mvc 自动映射,在控制器上创建操作。困惑的,asp.net-mvc,automapper,Asp.net Mvc,Automapper,我已经为automapper的工作做好了一切准备。属性作为一个属性运行良好 并正确填充DTO。我的控制器创建操作如下所示 [HttpPost] [AutoMap(typeof(User), typeof(UserCreateDTO))] public ActionResult Create(User user) { if (ModelState.IsValid) { _repository.Create(user); return Redirect

我已经为automapper的工作做好了一切准备。属性作为一个属性运行良好 并正确填充DTO。我的控制器创建操作如下所示

[HttpPost]
[AutoMap(typeof(User), typeof(UserCreateDTO))]
public ActionResult Create(User user)
{
    if (ModelState.IsValid)
    {
        _repository.Create(user);
        return RedirectToAction("Details", new { id = user.UserId });
    }

    return View("Edit", user);
}
public interface IUserRepository
{
    IQueryable<User> GetAllUsers();

    User GetUserById(Guid id);

    void Create(User user);
    User Edit(User user);
    void Delete(User user);

    void Save();
}
我在用户对象上设置了DataAnnotation,该对象是我的实体对象,并被传递 到存储库,该存储库是通过实现和到处使用用户对象实现的接口

我想做的是像下面一样使用上面相同的代码

[HttpPost]
[AutoMap(typeof(User), typeof(UserCreateDTO))]
public ActionResult Create(UserCreateDTO userdto)
{
    if (ModelState.IsValid)
    {
         _repository.Create(userdto);

            return RedirectToAction("Details", new { id = userdto.UserId });
    }

    return View("Edit", userdto);
}
问题: 我的DataAnnotation现在位于UserCreateDTO上,以限制我要验证的内容。 一旦验证通过,就会出现问题,即当我将userdto传递给创建方法时,该方法不允许我 因为用户对象在界面中,如下所示

[HttpPost]
[AutoMap(typeof(User), typeof(UserCreateDTO))]
public ActionResult Create(User user)
{
    if (ModelState.IsValid)
    {
        _repository.Create(user);
        return RedirectToAction("Details", new { id = user.UserId });
    }

    return View("Edit", user);
}
public interface IUserRepository
{
    IQueryable<User> GetAllUsers();

    User GetUserById(Guid id);

    void Create(User user);
    User Edit(User user);
    void Delete(User user);

    void Save();
}
公共接口存储库
{
IQueryable GetAllUsers();
用户GetUserById(Guid id);
作废创建(用户);
用户编辑(用户);
作废删除(用户);
作废保存();
}
我无法更改所有代码来替换接口和存储库中的UserCreateDTO,如果我有UserEditDTO/UserShowDTO会怎么样。
我如何解决这个问题?。我已经尽可能多地解释了。

为什么不在调用Create之前映射回用户对象?您不需要使用属性。您可以直接调用Map

Mapper.CreateMap<UserCreateDTO, User>();
var user = new user();
Mapper.Map<UserCreateDTO, User>(userdto, user);
Mapper.CreateMap();
var user=新用户();
Map(userdto,user);

将调试器设置为在映射调用后停止,并检查以确保正确复制了值。

为什么不在调用Create之前映射回用户对象?您不需要使用属性。您可以直接调用Map

Mapper.CreateMap<UserCreateDTO, User>();
var user = new user();
Mapper.Map<UserCreateDTO, User>(userdto, user);
Mapper.CreateMap();
var user=新用户();
Map(userdto,user);

将调试器设置为在映射调用后停止,并检查以确保正确复制了值。

请在我的上述操作方法中给出一个示例。我会很感激的。我是automapper的新手。您也可以通过创建自己的类继承automapper.Profile并覆盖Configure,将创建映射的调用移动到应用程序中的一个位置。有很多方法可以做到这一点。我向他展示了运行它所需的最小值。天哪,我已经为Mapper.CreateMap()完成了您所说的所有内容;此映射是平滑的,因为Source具有Destination的所有属性,但同样具有Mapper.CreateMap()的映射;正如rboarman所建议的,对于不是从DTO到用户的属性,我必须提到忽略是额外的工作。必须有简单的方法来解决我的问题?只忽略具有相同名称的属性。不匹配的不会引起问题。请在我上面的操作方法中给我一个例子。我会很感激的。我是automapper的新手。您也可以通过创建自己的类继承automapper.Profile并覆盖Configure,将创建映射的调用移动到应用程序中的一个位置。有很多方法可以做到这一点。我向他展示了运行它所需的最小值。天哪,我已经为Mapper.CreateMap()完成了您所说的所有内容;此映射是平滑的,因为Source具有Destination的所有属性,但同样具有Mapper.CreateMap()的映射;正如rboarman所建议的,对于不是从DTO到用户的属性,我必须提到忽略是额外的工作。必须有简单的方法来解决我的问题?只忽略具有相同名称的属性。不匹配的不会导致问题。