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; }
これは、各プロパティのセッターでクリーンなメソッドを呼び出すだけでなく、多くの価値がありますか?これが可能であったとしても、予想される動作によっては、多くの複雑さが生じるのではないかと心配しています。
私の提案は、関数を作成し、代わりにセッターから呼び出すことです。
このクラスのプロパティにアクセスするには、属性がクラスレベルである必要があると思います
まあ言ってみれば :
[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;}
}
これがお役に立てば幸いです:)
カスタムモデルバインダーを作成し、メソッドをオーバーライド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();