2009-10-02 3 views
8

FormCollection(コントローラーから提供された)を受け取った素晴らしい機能がありました。今度は、代わりにモデルバインドを行い、モデルバインダーにその関数を呼び出させ、FormCollectionが必要になります。何らかの理由で私はそれを見つけることができます。FormCollectionをカスタムモデルバインダーのcontrollerContextから取り出します

var formCollection = new FormCollection(controllerContext.HttpContext.Request.Form) 

FormCollectionは独自のModelBinderを持って、我々はASP.NET MVCに追加タイプである:私はそれがこれを試してみてくださいcontrollerContext.HttpContext.Request.Form

答えて

15

をしているだろうと思いました。 FormCollectionBinderAttributeのコードを見れば、私の言いたいことが分かります。

0

値を直接取得するためにbindingContext.ValueProvider(およびbindingContext.ValueProvider.TryGetValueなど)を使用します。

1

フォームコレクションに直接アクセスすると、すぐに怪我をするようです。以下は、別々のフォームフィールドに日付と時刻をキャプチャするカスタムRazor EditorTemplateがあるMVC4プロジェクトの例です。カスタムバインダーは、個々のフィールドの値を取得し、それらを組み合わせてDateTimeにします。

public class DateTimeModelBinder : DefaultModelBinder 
{ 
    private static readonly string DATE = "Date"; 
    private static readonly string TIME = "Time"; 
    private static readonly string DATE_TIME_FORMAT = "dd/MM/yyyy HH:mm"; 
    public DateTimeModelBinder() { } 

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext == null) throw new ArgumentNullException("bindingContext"); 

     var provider = new FormValueProvider(controllerContext); 
     var keys = provider.GetKeysFromPrefix(bindingContext.ModelName); 
     if (keys.Count == 2 && keys.ContainsKey(DATE) && keys.ContainsKey(TIME)) 
     { 
      var date = provider.GetValue(string.Format("{0}.{1}", bindingContext.ModelName, DATE)).AttemptedValue; 
      var time = provider.GetValue(string.Format("{0}.{1}", bindingContext.ModelName, TIME)).AttemptedValue; 
      if (!string.IsNullOrWhiteSpace(date) && !string.IsNullOrWhiteSpace(time)) 
      { 
       DateTime dt; 
       if (DateTime.TryParseExact(string.Format(System.Globalization.CultureInfo.CurrentCulture, "{0} {1}", date, time), 
              DATE_TIME_FORMAT, 
              System.Globalization.CultureInfo.CurrentCulture, 
              System.Globalization.DateTimeStyles.AssumeLocal, 
              out dt)) 
        return dt; 
      } 
     } 

     return base.BindModel(controllerContext, bindingContext); 
    } 
} 
関連する問題