Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#视图模型到模型_C#_.net_.net Core - Fatal编程技术网

C#视图模型到模型

C#视图模型到模型,c#,.net,.net-core,C#,.net,.net Core,我想检查一下我做的事情是否正确 所以我尝试在.NETCore中创建一个API 这就是控制器: [HttpPost] public IActionResult CreateAdministrator([FromBody]AdministratorViewModel administrator){ _unitOfWork.Administrators.Add(new Administrator { FirstName = administrator.FirstName

我想检查一下我做的事情是否正确

所以我尝试在.NETCore中创建一个API

这就是控制器:

[HttpPost]
public IActionResult CreateAdministrator([FromBody]AdministratorViewModel administrator){

    _unitOfWork.Administrators.Add(new Administrator
    {
       FirstName = administrator.FirstName,
       LastName = administrator.LastName,
       EmailAddress = administrator.EmailAddress,
       Password = administrator.Password,
       ManageAdministrators = administrator.ManageAdministrators
       });
       _unitOfWork.Complete();
    }
因此,我将
AdministratorViewModel
作为包含用户输入的对象。 然后我将信息传递给
管理员
对象以创建新的管理员

有没有更好的方法,然后一直写下去
property=administrator.property
。例如,如果我添加一个额外的字段
DateOfBirth
,我必须在3个不同的位置(viewmodel、model和controller)添加该字段

有没有办法只填充或“合并”两个对象的属性,以便自动填充所有已填充的属性


或者我应该用另一种方式来做这件事吗?

你可以用automapper来做

另一种方法是创建单独的方法,如

Administrator  ModelFromView (AdministratorViewModel viewModel) 
{
//mapping code
}

但每次以这种方式向类添加新属性时,都必须向该方法添加新的映射属性。Automapper允许避免这种情况。但有时您需要对映射过程进行更多控制,第二种方法可能会帮助您完成此操作。

您可以为类
管理员创建一个复制构造函数查看模型
,并在其中处理所有业务逻辑

之后,您可以使用:

_unitOfWork.Administrators.Add(new Administrator(administrator));

通过这种方式,当您以后决定添加更多属性时,您不必到处添加属性。

使用AutoMapper并不总是最好的方法。有趣的阅读。

AutoMapper是您所需要的


我在我的生产环境中使用了它

嗨,你可以使用AutoMapper。不幸的是,这是在询问人们认为什么是正确的解决方案。没有单一的解决方案,因为有多种思想流派。有一些是推广AutoMapper的,也有一些不是。一般来说,你真的不希望它自动工作,不受任何控制。假设出于某种原因,您的
管理员
模型中有一个名为
IsAdmin
的字段。并且假设您绑定了所有属性。攻击者将此字段添加到发布视图模型中会导致所谓的过度发布。无论您选择何种实际方式避免代码重复,请小心@WiktorZychla我试图用
IsAdmin
覆盖api,但当值绑定到
AdministratorViewModel
(不包含
IsAdmin
)时该值被忽略,因为它无法绑定到任何内容。避免使用AutoMapper的主要原因是安全性。如果用户无法从UI设置属性,AutoMapper将从客户端模型事件映射所有属性。但情况已经不同了,