警告用户必填字段C#

时间:2017-10-24 08:10:06

标签: c# entity-framework

我正在使用实体框架为我的项目开发一个框架结构 我目前正在使用数据库,但如果需要,可能会将其更改为CodeFirst。所以我的问题是我想在我的CRUDS中添加一些逻辑如何以通用方式执行此操作?有什么最佳做法吗?我在网上搜索但在这方面找不到任何东西。

这是一个展示我需要的例子: 假设我有一个 CLIENTS 表,其中包含以下字段

  • C_ROWID(int)(主键)(AI)(NOT_NULL)

  • C_CLIENT_ID(int)

  • C_IS_EMPLOYEED(bool)

  • C_JOB_TITLE(字符串)

因此情况如下:进行新注册时 用户需要输入C_CLIENT_ID

并且如果C_IS_EMPLOYED为真 那么我也想强迫用户输入客户的职称。

所以在上面的场景中,如果C_IS_EMPLOYEE为真并且用户将客户端ID和作业标题字段留空,我想向用户显示需要这些字段的警告,而不是保存信息。

那你的建议是什么?

1 个答案:

答案 0 :(得分:0)

我为了强制选择所需的外键我做了什么:

public class SomeDataEntity
{
    public int PrimaryKey { get; set; }

    [Required]
    public int? ForeignKey { get; set; }
}

使用Nullable,默认值为null  当没有选择任何内容时,EF和典型的验证技术都会识别Required属性。

另一个要求更复杂。

在数据库级别,您可以引入CHECK constraint。确保选择适用于您的数据库的布尔比较和字符串比较。对于某些数据库,C_JOB_TITLE可能仍为空,而不是NULL

CONSTRAINT CHK_JobTitle CHECK (C_IS_EMPLOYEED = 0 OR C_JOB_TITLE IS NOT NULL)

在应用程序级别,您可以开发一些自定义验证属性。以下只是一个非常粗略的粗略草图:

[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
sealed class RequiredIfAttribute : ValidationAttribute
{
    readonly string boolPropertyName;

    public RequiredIfAttribute(string boolPropertyName)
    {
        this.boolPropertyName = boolPropertyName;

        throw new NotImplementedException();
    }

    public string BoolPropertyName
    {
        get { return boolPropertyName; }
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var prop = validationContext.ObjectType.GetProperty(BoolPropertyName);
        if (prop == null)
        {
            throw new ValidationException("Property not found: " + BoolPropertyName);
        }
        var condition = prop.GetValue(validationContext.ObjectInstance) as bool?;
        if (condition == true && string.IsNullOrEmpty(value as string))
        {
            return new ValidationResult("Required: " + validationContext.MemberName);
        }

        return ValidationResult.Success;
    }
}

用法

public class SomeDataEntity
{
    public int PrimaryKey { get; set; }

    [Required]
    public int? ForeignKey { get; set; }

    public bool C_IS_EMPLOYEED { get; set; }

    [RequiredIf("C_IS_EMPLOYEED")]
    public string C_JOB_TITLE { get; set; }
}