2012-06-18 56 views
3

我可以創建一個屬性,讓我在ASP.NET MVC模型中修改它的值嗎?它與下面的這個問題有關,'%'被髮送到數據庫,但我想通過一種通用的方式來轉義某些字符,而數據來自UI。我知道你可以驗證屬性,但是你可以在SET上修改它們嗎?逃避ASP.NET MVC模型屬性中的某些字符

MySQL and LIKE comparison with %

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

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

回答

1

這是否有很多的價值在剛剛調用的setter每個屬性乾淨的方法是什麼?我擔心即使這是可能的,它也會帶來很多複雜性,取決於預期的行爲。

我的建議是製作一個函數,然後從setter中調用它。

+0

我有很多的模型和裝飾它的屬性將是首選,但是我可以去使用靜態方法,它在每個屬性內。 –

0

我覺得你的屬性應該是在類級別以訪問這個類的屬性

比方說:

[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;} 
} 

希望這幫助:)

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(); 
相關問題