ASP.NET Core 2.1的属性:将模型值设置为小写

3
我希望了解如何在控制器接收模型时以一种简洁的方式强制某些属性的值始终为小写或大写。最好使用属性进行操作。

例如:

控制器:

[HttpPost]
public async Task<Model> Post(Model model)
{
    //Here properties with the attribute [LowerCase] (Prop2 in this case) should be lowercase.
}

模型:

public class Model
{
    public string Prop1 { get; set; }

    [LowerCase]
    public string Prop2 { get; set; }
}

我听说使用自定义的ValidationAttribute更改值并不是一个好习惯。我还决定创建一个自定义的DataBinder,但是在尝试实现时,我的控制器只返回了null,我不知道该如何正确地实现。


当我尝试时,在我的控制器中只收到了null - 请[编辑]问题并展示你尝试过什么,这样我们可以帮助你解决这个问题。 - Peter B
所以,您希望在其他地方(即数据库)不受影响,但在控制器实例中进行转换吗?如果是这样,您可以创建一个新的ModelVM,在构造函数中接受Model并在那一点上进行转换。然后,在您的控制器中,您可以使用ModelVM并对其进行必要的操作。 - scgough
实际上,它可以作为小写形式持久化在数据库中,因此不需要虚拟机。我没有在Getter/Setter中进行转换,因为会有更多的转换(不仅仅是大写/小写),因此拥有一个属性对于维护和可搜索性来说更好(有很多模型,找到哪些正在被转换会很好)。这里没有放DataBinder示例,因为那里没有处理转换,只是试图弄清楚它的工作原理。 - jpcrrs
4个回答

3

替代方案: 流畅的 API:

modelBuilder.Entity<Model>()
    .Property(x => x.Prop2)
    .HasConversion(
        p => p == null ? null : p.ToLower(),
        dbValue => dbValue);

或者,将其封装在类本身中,使用具有后备字段的属性:
private string _prop2;
public string Prop2
{ 
    get => _prop2;
    set => value?.ToLower();
}

1
决定使用自定义的Json转换器。
public class LowerCase : JsonConverter
{
    public override bool CanRead => true;
    public override bool CanWrite => false;
    public override bool CanConvert(Type objectType) => objectType == typeof(string);

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return reader.Value.ToString().ToLower();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

public class Model
{
    public string Prop1 { get; set; }

    [JsonConverter(typeof(LowerCase))]
    public string Prop2 { get; set; }
}

不过我仍然认为有更好的方法,会继续寻找。


0

你可以创建只读属性

 public string Prop2 { get{return Prop1.ToLower()}}

或者像这样

 public string Prop2 => Prop1.ToLower();

在我看来,OP并不希望将Prop1Prop2连接起来。 - Peter B
确切地说,这两个属性之间没有关系。正如所述,我不会在Getter/Setter中进行转换,因为还会有更多的转换(不仅仅是大写/小写),因此拥有一个属性对于维护和可搜索性来说更好(有很多模型,找到哪些正在被转换会很好)。 - jpcrrs
哦,好的,你想使用 ValidationAttribute。我认为这个链接会对你有所帮助 https://dev59.com/I3E85IYBdhLWcg3wQxPG#6216679 - Ahmed Ghoniem
实际上,我说过我不想使用ValidationAttribute,它似乎并不正确。IsValid似乎不是一种引起变异的方法,而只是验证输入是否正确,我想有更好的方法来做到这一点。 - jpcrrs
使用数据传输对象(DTO)或视图模型然后使用自动映射将领域模型进行映射,怎么样? - Ahmed Ghoniem

-1
你可以像这样构建一个类的构造函数:
public class Model
{
        public Model()
        {
            this.Prop2 = this.Prop2.ToLower();
        }
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接