2009-10-02 5 views

Répondre

15

Essayez ceci:

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

FormCollection est un type nous avons ajouté à ASP.NET MVC qui a sa propre ModelBinder. Vous pouvez regarder le code pour FormCollectionBinderAttribute pour voir ce que je veux dire.

0

Utilisez bindingContext.ValueProvider (et bindingContext.ValueProvider.TryGetValue, etc.) pour obtenir des valeurs directement.

1

L'accès à la collection de formulaires semble être désapprouvé. Voici un exemple d'un projet MVC4 dans lequel j'ai un Razor EditorTemplate personnalisé qui capture la date et l'heure dans des champs de formulaire distincts. Le classeur personnalisé récupère les valeurs des champs individuels et les combine en un 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); 
    } 
} 
Questions connexes