如何增强 ASP.NET Core 中的 ModelBinder(更新模型类的属性值)

Mak*_*kla 5 c# asp.net-core asp.net-core-2.0

我想增强ModelBinder返回的最终结果。
例如:

public class MyModel
{
    public int Order {get;set;}

    [MyUpperCaseAttribute]
    public string Title {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

在 API 方法中,我希望MyModelhas 的所有字符串属性MyUpperCaseAttribute都是大写的。

例如:

[HttpPost("AddRecord")]
public async Task<ActionResult<int>> AddRecord(MyModel model)
{
    model.Title should be upper case, even if send from client in lower case.
}
Run Code Online (Sandbox Code Playgroud)

我的想法是覆盖默认值ModelBinder并枚举所有属性并检查属性是否为字符串并且具有MyUpperCaseAttribute并将属性值更正为大写。我检查了文档,但示例没有填写正确,因为它们完全重新设计了返回的内容。我只想修改结果属性。

实现所需行为的最佳选择是什么?

重要提示:(已编辑):
如果指令属性可以堆叠,那就太好了:

public class MyModel
{
    public int Order {get;set;}
    [MyUpperCaseAttribute]
    [RemoveSpacesAttribute]
    public string Title {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

编辑:它看起来与
类似,但如果不是其他,这是 ASP.NET Core,链接上只是 ASP.NET。方法、属性、接口……都不一样。

我应该说,如果 JSON 大小写规则能够工作那就太好了:

public class MyModel
{
    public int Order {get;set;}
    public string Title {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

如果{order: 1, title: "test"}(注意小写)是从 JavaScript 发送的,应该可以工作。

Tan*_*jel 0

您可以在您的内部执行此操作,MyUpperCaseAttribute如下所示:

public class MyUpperCaseAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if(value != null)
        {
            validationContext.ObjectType
            .GetProperty(validationContext.MemberName)
            .SetValue(validationContext.ObjectInstance, value.ToString().ToUpper(), null);
        }

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

属性值将转换为UpperCase期间Model Binding。我已经在我身边检查过了,效果非常好。

  • 我想避免这种情况。现在我有近 100 个不同的 API 调用,我希望避免在每个 API 方法中编写此代码。另外,如果我在 2 个不同的 API 方法中使用相同的“模型”会怎么样。我需要用两种方法编写这段代码。仅在其中一个上使用“ModelBinder”。 (2认同)
  • 嗨@TanvirArjel,我只是检查 JsonContractResolver 和 [this](https://github.com/aspnet/Mvc/issues/6884),因为在验证模拟中更新模型有点奇怪。当我研究东西时会回来。 (2认同)