3

我可以创建一个属性,让我在我的 ASP.NET MVC 模型中修改它的值吗?它与下面将“%”发送到数据库的问题有关,但我想要一种通用方法来转义某些字符,数据来自 UI。我知道您可以验证属性,但您可以在 SET 上修改它们吗?

MySQL 和 LIKE 比较与 %

[Clean]
public string FirstName { get; set; }

[Clean]
public string LastName{ get; set; }
4

3 回答 3

1

与仅在设置器中为每个属性调用一个干净的方法相比,这是否具有很多价值?我担心即使这是可能的,它也会引入很多复杂性,具体取决于预期的行为。

我的建议是只创建一个函数并从 setter 调用它。

于 2012-06-18T21:24:30.360 回答
0

您所要做的就是创建一个自定义模型绑定器并覆盖SetProperty进行清理的方法。

public class CustomModelBinder: DefaultModelBinder
{
    protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
    {
        if (propertyDescriptor.Attributes.Contains(new Clean()) && propertyDescriptor.PropertyType == typeof(string))
        {
            value = value != null ? ((string)value).Replace("%", "") : value;
        }

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

您可以使用这些选项中的任何一个来使用您的自定义模型绑定器。

在 Global.asax.cs 中为特定模型注册自定义绑定器

ModelBinders.Binders.Add(typeof(MyModel), new CustomModelBinder());

在动作参数中注册自定义活页夹

public ActionResult Save([ModelBinder(typeof(CustomModelBinder))]MyModel myModel)
{
}

将自定义绑定器注册为默认模型绑定器。

ModelBinders.Binders.DefaultBinder = new CustomModelBinder();
于 2012-06-19T04:04:08.323 回答
0

我认为您的 Attribute 应该处于类级别才能访问此类属性

让我们说:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class ClearAttribute : ValidationAttribute
{
    private string[] wantedProperties;

    public ClearAttribute(params string[] properties)
    {
        wantedProperties = properties;
    }

    public override object TypeId
    {
        get { return new object(); }
    }

    public override bool IsValid(object value)
    {
        PropertyInfo[] properties = value.GetType().GetProperties();
        foreach (PropertyInfo property in properties)
        {
            if (wantedProperties.Contains(property.Name))
            {
                var oldValue = property.GetValue(value, null).ToString();
                var newValue = oldValue + "Anything you want because i don't know a lot about your case";
                property.SetValue(value, newValue, null);
            }
        }
        return true;
    }
}

用法应该是:

[Clear("First")]
public class TestMe{
   public string First {get; set;}
   public string Second {get; set;}
}

希望这有帮助:)

于 2012-06-18T21:40:31.757 回答