2012-03-19 9 views
1

私はビューモデルで特定の文字列プロパティをグローバルにインターセプトして変更する方法として、カスタムモデルのバインダを探していました。カスタムモデルバインダーは両方向で動作できますか?

私はSetPropertyをオーバーライドし、POSTされている値を操作することができますが、他の方法はどうですか?

たとえば、私のモデルから出てくるすべての文字列をトリム()したいと思うかもしれません。これはモデルバインダーで可能ですか、何か不足していますか? GetPropertyValueをオーバーライドしてみましたが、ビューが読み込まれたときに起動するようには見えません。

何か指摘していただければ幸いです。

答えて

1

いいえ、モデルバインダーは一方向のみで動作します。

たとえば、ViewResultまたはPartialViewResultを拡張するなどして、独自のActionResultインスタンスを作成できます。

また、ActionFilterAttributeを実装して文字列をトリミングすることもできます。

public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
    var model = filterContext.Controller.ViewData.Model; 
    ... 
} 

それとも、ブルートフォース

public class MyModel 
{ 
    private string _myProp 

    public string MyProp 
    { 
     set { _myProp = value.Trim(); } 
     get { return _myProp; } 
    } 
} 

を行うことができます...しかし、あなたはビューにコントローラから行くモデルをバインドするためのモデルバインダーを使用することはできません。

+0

ActionFilterAttributeを実装しようとしましたが、ActionExecutingContext filterContextからモデルにアクセスするにはどうすればよいですか? – bigtv

+0

更新された回答を参照してください。あなたのモデルは 'object'とタイプされるので、リフレクションAPIは文字列プロパティをトリムする必要があります。 – danludwig

関連する問題