2011-01-11 6 views
3

MVC2のPOSTデータからバインドする前に、いくつかの値をフィルタリングする必要があります。残念ながら、私はときどき小数点にマップされるフォーム値の "N/A"を渡すクライアント側のコードを変更することはできません?タイプ。何が起こる必要があるかは、「N/A」がPOST値でバインド/検証される前に空白になっている場合です。MVC ModelBindersを使用してバインド前のポスト値をフィルタリングする

私はそれがDefaultModelBinderを拡張ModelBinderを使用して作業を取得するために、すべての午前しようとしました:

私がいる問題は、私が最初に掲載さ値へのアクセスを取得する方法がわからないです
public class DecimalFilterBinder : DefaultModelBinder 
{ 
    protected override void BindProperty(ControllerContext controllerContext, 
     ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) 
    { 
     if (propertyDescriptor.PropertyType == typeof(decimal?)) 
     { 
      var model = bindingContext.Model; 
      PropertyInfo property = model.GetType().GetProperty(propertyDescriptor.Name); 
      var httpRequest = controllerContext.RequestContext.HttpContext.Request; 
      if (httpRequest.Form[propertyDescriptor.Name] == "-" || 
       httpRequest.Form[propertyDescriptor.Name] == "N/A") 
      { 
       property.SetValue(model, null, null); 
      } 
      else 
      { 
       base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
      } 
     } 
     else 
     { 
      base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
     } 
    } 
} 

それがリストの中にあるとき。 Form[propertyDescriptor.Name]にすることはできません。これはフォームのリスト項目に含まれているためです(たとえば、入力は実際にはValues[0].Property1です)。私はモデルバインダーをglobal.asaxに接続して正常に動作していますが、デフォルトのバインディングが発生する前に元のフォーム値を空の文字列にフィルタリングする方法を知りません。

答えて

1

WowのbindingContextには、(リスト項目の)接頭辞を与えるModelNameプロパティがあります。これを使用すると、元のフォームの値を取得できます。

... 
var httpRequest = controllerContext.RequestContext.HttpContext.Request; 
if (httpRequest.Form[bindingContext.ModelName + propertyDescriptor.Name] == "-" || 
    httpRequest.Form[bindingContext.ModelName + propertyDescriptor.Name] == "N/a") 
{ 
    property.SetValue(model, null, null); 
} 
else 
{ 
    base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
} 
... 
関連する問題