【发布时间】:2020-04-13 07:26:28
【问题描述】:
我创建了一个包含所有基本验证属性和数据注释的模型
但我面临一个问题,因为我不能将此类用作表单模型,因为它具有额外的属性,并且我需要尽可能小的表单对象,因为我将其序列化的 json 发送到 API。
我可以通过仅将所需的属性及其属性复制到另一个类来接近“已经完成的”,我不应该担心保持值相同,因为它们将共享相同的常量,但如果我决定删除这可能会适得其反或添加属性。我必须转到每个表单模型并添加/删除属性
是否有一些内置属性可以克隆给定属性的所有属性?像下一个例子一样?
属性类
[AttributeUsage(AttributeTargets.Property)]
public class ClonePropertyAttributesAttribute : Attribute
{
public ClonePropertyAttributesFromAttribute(Type TargetType,String PropertyName)
{
//clone attributes logic here
}
}
表单模型
public class SignUpFormModel
{
[ClonePropertyAttributesFrom(typeof(User),"Email")]
public String Email { get; set; }
[ClonePropertyAttributesFrom(typeof(User),"Username ")]
public String Username { get; set; }
[ClonePropertyAttributesFrom(typeof(User),"Password")]
public String Password { get; set; }
[ClonePropertyAttributesFrom(typeof(User),"First_Name ")]
public String First_Name { get; set; }
[ClonePropertyAttributesFrom(typeof(User),"Last_Name")]
public String Last_Name { get; set; }
[ClonePropertyAttributes(AttributeProvider(typeof(User).GetProperty("Profile_Picture")))]
public String Profile_Picture { get; set; }
}
型号
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; }
}
更新#1
这里有一些可能的重复:
stackoverflow.com/questions/49701038
stackoverflow.com/questions/14663763
这似乎很烦人,而且每次注册看起来都是一项昂贵的操作,不是吗?
【问题讨论】:
-
嗯,我考虑过使用继承,但这显然行不通; stackoverflow.com/questions/2520035/…
-
它应该可以正常工作,但正如我所说,我需要尽可能少的属性,因为我在 api 调用中发送序列化的 json。例如,我将 FormModel 中提到的六个属性放在一个基类中,如果我只需要两个呢?
-
您是否假设额外的属性将成为问题,或者您是否存在特定表单不需要的 2-3 个属性的性能问题?我感觉你是通过创造一个实际的问题来解决想象中的问题。
-
@DStanley 不是性能问题,问题是我绑定到一些非对称加密系统,其中保存的密钥允许加密有限数量的数据.. 遗憾的是,序列化 json 中的开销会导致问题.而且这只是一个演示代码,用户类实际上比这个大很多
标签: c# asp.net-mvc