【问题标题】:MVC model require all fieldsMVC 模型需要所有字段
【发布时间】:2018-04-10 17:51:39
【问题描述】:

我有一个带有 EF6 的 MVC 应用程序。有没有办法自动将模型的所有属性设置为[Required]?我们的一些模型很大,包含所有必填字段。有什么方法可以节省代码行或使代码更简洁?

public class Employee{
    [Required]
    public string Name { get; set; }
    [Required]
    public string Address 1 { get; set; }
    [Required]
    public string Address 2 { get; set; }
    [Required]
    public int SSN { get; set; }
    [Required]
    public double PayRate { get; set; }
    [Required]
    public int PayType { get; set; }
    [Required]
    public string JobTitle { get; set; }
    [Required]
    public bool FullTime { get; set; }
    [Required]
    public string Sex { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public string Name { get; set; }
}

谢谢

【问题讨论】:

  • 没有。但只有 string 和可为空的类型属性才需要它。
  • 正如本文 stackoverflow.com/questions/46098291/… 的 cmets 中所述,这是不可能的。评论者还解释了为什么你不应该,即使你可以。
  • 感谢您的链接。这是有道理的,回答了我的问题。
  • 如果你想这样回答我会批准的。
  • 你可以通过修改model1.tt来适应你的需要。但正如 Adosi 所说,只有在绝对必要时才应该这样做。

标签: c# asp.net-mvc entity-framework


【解决方案1】:

您可以通过 Fluent API 和“动态”Expressions 的方式 MakeStringColumnsRequiredMakeAllNullableColumnsRequired

protected void MakeStringColumnsRequired<T>(DbModelBuilder modelBuilder)
    where T : class
{
    var type = typeof(T);
    foreach (var prop in type.GetProperties().Where(x => x.PropertyType == typeof(string)))
    {
        var argParam = Expression.Parameter(type, "x");
        var nameProperty = Expression.Property(argParam, prop.Name);
        var lambda = Expression.Lambda<Func<T, string>>(nameProperty, argParam);
        modelBuilder.Entity<T>().Property(lambda).IsRequired();
    }            
}

protected  void MakeAllNullableColumnsRequired<T>(DbModelBuilder modelBuilder)
    where T : class
{
    var type = typeof(T);

    foreach (var prop in type.GetProperties()
        .Where(x => Nullable.GetUnderlyingType(x.PropertyType) != null || x.PropertyType == typeof(string))
        )
    {
        var argParam = Expression.Parameter(type, "x");
        var nameProperty = Expression.Property(argParam, prop.Name);

        var funcType = typeof(Func<,>);
        funcType = funcType.MakeGenericType(typeof(T), prop.PropertyType);

        var lambdaMethod = typeof(Expression).GetMethods(BindingFlags.Public | BindingFlags.Static)
            .Where(x => x.Name == "Lambda" && x.IsGenericMethod).First();
        lambdaMethod = lambdaMethod.MakeGenericMethod(funcType);                

        var lambda = lambdaMethod.Invoke(null, new object[] { nameProperty, new ParameterExpression[] { argParam } });                

        var entity = modelBuilder.Entity<T>();
        var entityPropertyMethods = entity.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance)
            .Where(x => x.Name == "Property" && !x.IsGenericMethod).ToList();                

        var entityPropertyMethod = entityPropertyMethods
            .Where(x => x.GetParameters().First().ParameterType.GetGenericArguments().First().GetGenericArguments().Last() == prop.PropertyType)
            .FirstOrDefault();
        if(entityPropertyMethod == null)
        {
            entityPropertyMethod = entity.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance)
                .Where(x => x.Name == "Property" && x.IsGenericMethod).Last();
            entityPropertyMethod = entityPropertyMethod.MakeGenericMethod(Nullable.GetUnderlyingType(prop.PropertyType));
        }                

        var property = entityPropertyMethod.Invoke(entity, new object[] { lambda });
        var isRequired = property.GetType().GetMethod("IsRequired");
        isRequired.Invoke(property, null);                
    }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{        
#if StringColumnsRequired
    MakeStringColumnsRequired<Employee>(modelBuilder);
#else
    MakeAllNullableColumnsRequired<Employee>(modelBuilder)  
#endif
}

【讨论】:

  • 最好向 OP 展示如何添加可为空的属性支持
  • @Oliver,我发布了所有可空类型的代码以及字符串。
  • 谢谢!我还没有实现这个。下次它出现时,我仍然可以。但它看起来正是我想要的。
猜你喜欢
  • 2012-09-03
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 2020-04-26
相关资源
最近更新 更多