Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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#_Asp.net Mvc - Fatal编程技术网

C# 将一个属性的属性复制到另一个属性,而不是再次写入属性

C# 将一个属性的属性复制到另一个属性,而不是再次写入属性,c#,asp.net-mvc,C#,Asp.net Mvc,我创建了一个包含所有基本验证属性和数据注释的模型 但是我面临一个问题,因为我不能使用这个类作为表单模型,因为它有额外的属性,而且我需要表单对象尽可能小,因为我要将它的序列化json发送到API。 我可以通过只将所需的属性及其属性复制到另一个类来接近“which ready do”,我不必担心保持值不变,因为它们将共享相同的常量,但如果我决定删除或添加属性,这可能会适得其反。我必须转到每个表单模型并添加/删除属性 是否有一些内置属性可以克隆给定属性的所有属性?比如下一个例子 属性类 形式模型 模型

我创建了一个包含所有基本验证属性和数据注释的模型 但是我面临一个问题,因为我不能使用这个类作为表单模型,因为它有额外的属性,而且我需要表单对象尽可能小,因为我要将它的序列化json发送到API。

我可以通过只将所需的属性及其属性复制到另一个类来接近“which ready do”,我不必担心保持值不变,因为它们将共享相同的常量,但如果我决定删除或添加属性,这可能会适得其反。我必须转到每个表单模型并添加/删除属性

是否有一些内置属性可以克隆给定属性的所有属性?比如下一个例子

属性类 形式模型 模型 更新#1 以下是一些可能的重复项:



这看起来很无聊,而且每次注册时都要做一个昂贵的操作,不是吗?

您可以使用AutoMapper从
用户
映射到
注册表单模型

当您需要从模型类(或数据库模型的实体)映射到API调用中使用的DTO对象以及相反方向时,AutoMapper非常有用

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<User, SignUpFormModel>();
});

IMapper mapper = config.CreateMapper();
var user = new User() { First_Name = "tester" };
var formModel = mapper.Map<User, SignUpFormModel>(user);
var config=new-MapperConfiguration(cfg=>{
CreateMap();
});
IMapper mapper=config.CreateMapper();
var user=new user(){First_Name=“tester”};
var formModel=mapper.Map(用户);

更新:

如果属性名称在源类和目标类中不匹配,则可以为其创建自定义映射,例如:

cfg.CreateMap<SignUpFormModel, User>()
    .ForMember(x => x.EmailInDestination, o => o.MapFrom(s => s.EmailInSource))
cfg.CreateMap()
.ForMember(x=>x.EmailInDestination,o=>o.MapFrom(s=>s.EmailInSource))

我能想到的唯一方法是在运行时通过反射获取属性,然后将其应用于其他类

见:

和设置属性:

缺点: -反射很慢 -不是真正的类型安全


我不是这个方法的真正粉丝,但我个人认为没有其他方法。我认为你应该试着修改你的架构,也许这样你就可以解决这个问题。

hmm我曾考虑过使用Inheritance,但这显然不起作用;它应该可以很好地工作,但正如我所说的,我需要尽可能少的属性,因为我在api调用中发送序列化的json。例如,我将FormModel中提到的六个属性放在一个基类中,如果我只需要两个,该怎么办?您是否假设额外的属性将是一个问题,或者您是否有2-3个特定表单不需要的属性的性能问题?我感觉你是在通过创建一个实际的问题来解决一个想象中的问题。@DStanley不是一个性能问题,问题是我绑定到一个非对称加密系统,该系统保存了密钥,允许对有限数量的数据进行加密。。不幸的是,序列化json中的开销将导致问题。此外,这只是一个演示代码,用户类实际上比这个大得多。我不熟悉这个库。在此代码中,您是否在类似属性之间映射值?正如我所注意到的,您正在实例化一个用户对象,填充它的第一个名称。。我不确定它是否克隆了默认情况下具有相同属性名称的类似属性名称AutoMapper maps属性,它还默认支持展平()。它还支持配置属性的自定义映射。对于您的模型,可以使用默认映射,因为表单模型中的所有属性都具有与用户类中相同的名称。这可能会起作用,但我认为我需要在运行时这样做,因为我在表单的开头将表单模型用作asp.net mvc form@Models.FormModels.SignUpFormModel中的包装器。正如我在代码最后一行看到的结果映射对象。它提供了一个映射实例,但我想要的是复制属性,并将实际的类定义粘贴到表单开头的这一行
@Models.FormModels.SignUpFormModel
。这就是我的意思。。不过,我仍在努力弄明白这一点。看起来有多种方法可以实现mpping:)更新了答案,现在它显示了属性的自定义映射示例,现在我理解了问题,所以你的意思是我必须设计自己的属性,在参数中获取给定属性,并使用反射访问其属性,然后将它们分配给给定成员?对我这样的新手来说似乎很难。。实际上,我考虑过使用基类,但正如我所说的,有时我不需要该基类中的所有属性,在序列化过程中会留下一些大小开销json@MinaGerges首先,我也不喜欢这种方法。也许只是使用基类,我怀疑大小开销将是一个很大的问题。这是因为我绑定到某个非对称加密系统,该系统使用保存的密钥加密有限数量的数据。。因此,可悲的是,开销将导致问题
public class User
{
    //### Constansts Definitions ###//
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long? Id { get; set; }
    [Display(Name = EMAIL_DISPLAY_NAME)]
    [Required(ErrorMessage = EMAIL_REQUIRED_ERROR_MESSAGE)]
    [StringLength(EMAIL_MAX_LENGTH, ErrorMessage = EMAIL_LENGTH_ERROR_MESSAGE)]
    [RegularExpression(EMAIL_REGEX, ErrorMessage = EMAIL_REGEX_ERROR_MESSAGE)]
    [Remote(EMAIL_REMOTE_DOES_EXIST_ACTION_NAME, EMAIL_REMOTE_EXIST_CONTROLLER_NAME, ErrorMessage = EMAIL_REMOTE_DOES_EXIST_ERROR_MESSAGE)]
    [JsonProperty(EMAIL_JSON_PROPERTY_NAME)]
    public String Email { get; set; }
    [Display(Name = USERNAME_DISPLAY_NAME)]
    [Required(ErrorMessage = USERNAME_REQUIRED_ERROR_MESSAGE)]
    [StringLength(USERNAME_MAX_LENGTH, MinimumLength = USERNAME_MIN_LENGTH, ErrorMessage = USERNAME_LENGTH_ERROR_MESSAGE)]
    [RegularExpression(USERNAME_REGEX, ErrorMessage = USERNAME_REGEX_ERROR_MESSAGE)]
    [Remote(USERNAME_REMOTE_DOES_EXIST_ACTION_NAME, USERNAME_REMOTE_EXIST_CONTROLLER_NAME, ErrorMessage = USERNAME_REMOTE_DOES_EXIST_ERROR_MESSAGE)]
    [JsonProperty(USERNAME_JSON_PROPERTY_NAME)]
    public String Username { get; set; }
    [Display(Name = PASSWORD_DISPLAY_NAME)]
    [Required(ErrorMessage = PASSWORD_REQUIRED_ERROR_MESSAGE)]
    [StringLength(PASSWORD_MAX_LENGTH, MinimumLength = PASSWORD_MIN_LENGTH, ErrorMessage = PASSWORD_LENGTH_ERROR_MESSAGE)]
    [RegularExpression(PASSWORD_REGEX,ErrorMessage = PASSWORD_REGEX_ERROR_MESSAGE)]
    [JsonProperty(PASSWORD_JSON_PROPERTY_NAME)]
    public String Password { get; set; }
    [Display(Name = FIRST_NAME_DISPLAY_NAME)]
    [Required(ErrorMessage = FIRST_NAME_REQUIRED_ERROR_MESSAGE)]
    [StringLength(FIRST_NAME_MAX_LENGTH, MinimumLength = FIRST_NAME_MIN_LENGTH, ErrorMessage = FIRST_NAME_LENGTH_ERROR_MESSAGE)]
    [RegularExpression(FIRST_NAME_REGEX, ErrorMessage = FIRST_NAME_REGEX_ERROR_MESSAGE)]
    [JsonProperty(FIRST_NAME_JSON_PROPERTY_NAME)]
    public String First_Name { get; set; }
    [Display(Name = LAST_NAME_DISPLAY_NAME)]
    [Required(ErrorMessage = LAST_NAME_REQUIRED_ERROR_MESSAGE)]
    [StringLength(LAST_NAME_MAX_LENGTH, MinimumLength = LAST_NAME_MIN_LENGTH, ErrorMessage = LAST_NAME_LENGTH_ERROR_MESSAGE)]
    [RegularExpression(LAST_NAME_REGEX, ErrorMessage = LAST_NAME_REGEX_ERROR_MESSAGE)]
    [JsonProperty(LAST_NAME_JSON_PROPERTY_NAME)]
    public String Last_Name { get; set; }
    [JsonProperty(PROFILE_PICTURE_JSON_PROPERTY_NAME)]
    public String Profile_Picture { get; set; }
    [JsonProperty(REGISTERATION_TIME_JSON_PROPERTY_NAME)]
    public long? RegisterationTime { get; set; }
    [JsonProperty(VERIFIED_JSON_PROPERTY_NAME)]
    public int? Verified { get; set; }
    [JsonProperty(INACCESSIBLE_JSON_PROPERTY_NAME)]
    public int? Inaccessible { get; set; }
}
var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<User, SignUpFormModel>();
});

IMapper mapper = config.CreateMapper();
var user = new User() { First_Name = "tester" };
var formModel = mapper.Map<User, SignUpFormModel>(user);
cfg.CreateMap<SignUpFormModel, User>()
    .ForMember(x => x.EmailInDestination, o => o.MapFrom(s => s.EmailInSource))