基于属性处理模型的属性

时间:2017-01-24 04:56:20

标签: c# asp.net-core

此问题必须先问过,但无法找到。

我知道通过创建自定义模型绑定器,我可以处理用户输入的数据。有修剪字符串属性的示例。这是一个例子:ASP.NET MVC: Best way to trim strings after data entry. Should I create a custom model binder?

我的问题是如何使用自定义属性控制何时处理或不处理。

例如,我可能想要自动大写字符串属性的第一个字母,只有我有一个如下所示的属性:

public class MyModel
{
   [CapitalizeFirstLetter]
   public string FirstName { get; set; }

   [CapitalizeFirstLetter]
   public string LastName { get; set; }

   public string UserName { get; set; }
}

在此示例中,将处理名字和姓氏属性,但不会处理用户名,尽管这三个属性都是字符串属性。

我该如何处理?

1 个答案:

答案 0 :(得分:1)

您需要检查属性以查看它是否具有特定的属性集:

public class CapitalizeFirstLetterModelBinder : DefaultModelBinder
{
    protected override void SetProperty(
        ControllerContext controllerContext, 
        ModelBindingContext bindingContext, 
        System.ComponentModel.PropertyDescriptor propertyDescriptor,
        object value)
    {
        if (propertyDescriptor.Attributes.Any(att => typeof(att) == typeof(CapitalizeFirstLetterAttribute))
        {
            var stringValue = (string)value;
            if (!string.IsNullOrWhiteSpace(stringValue))
            {
                value = stringValue.First().ToString().ToUpper() + stringValue.Substring(1);
            }
            else
            {
                value = null;
            }
        }

        base.SetProperty(controllerContext, bindingContext, 
                      propertyDescriptor, value);
    }
}