3

ASP.NET MVCモデルでその値を変更できる属性を作成できますか?これは、「%」がデータベースに送信される以下の質問に関連していますが、UIからのデータで特定の文字をエスケープする一般的な方法が必要です。プロパティを検証できることは知っていますが、SETで変更できますか?

MySQLとLIKEの%との比較

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

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

3 に答える 3

1

これは、各プロパティのセッターでクリーンなメソッドを呼び出すだけでなく、多くの価値がありますか?これが可能であったとしても、予想される動作によっては、多くの複雑さが生じるのではないかと心配しています。

私の提案は、関数を作成し、代わりにセッターから呼び出すことです。

于 2012-06-18T21:24:30.360 に答える
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;}
}

これがお役に立てば幸いです:)

于 2012-06-18T21:40:31.757 に答える
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 に答える