我可以创建一个属性,让我在我的 ASP.NET MVC 模型中修改它的值吗?它与下面将“%”发送到数据库的问题有关,但我想要一种通用方法来转义某些字符,数据来自 UI。我知道您可以验证属性,但您可以在 SET 上修改它们吗?
[Clean]
public string FirstName { get; set; }
[Clean]
public string LastName{ get; set; }
我可以创建一个属性,让我在我的 ASP.NET MVC 模型中修改它的值吗?它与下面将“%”发送到数据库的问题有关,但我想要一种通用方法来转义某些字符,数据来自 UI。我知道您可以验证属性,但您可以在 SET 上修改它们吗?
[Clean]
public string FirstName { get; set; }
[Clean]
public string LastName{ get; set; }
与仅在设置器中为每个属性调用一个干净的方法相比,这是否具有很多价值?我担心即使这是可能的,它也会引入很多复杂性,具体取决于预期的行为。
我的建议是只创建一个函数并从 setter 调用它。
您所要做的就是创建一个自定义模型绑定器并覆盖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();
我认为您的 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;}
}
希望这有帮助:)