У меня была хорошая функция, которая взяла мою коллекцию FormCollection (предоставленную контроллером). Теперь я хочу выполнить привязку модели, и мое связующее устройство модели вызовет эту функцию, и ей понадобится FormCollection. Почему-то я могу это найти. Я думал, это будет controllerContext.HttpContext.Request.Form
Получить FormCollection out controllerContext для привязки пользовательской модели
Ответы (3)
Попробуй это:
var formCollection = new FormCollection(controllerContext.HttpContext.Request.Form)
FormCollection - это тип, который мы добавили в ASP.NET MVC, который имеет собственный ModelBinder. Вы можете посмотреть код FormCollectionBinderAttribute, чтобы понять, что я имею в виду.
person
Haacked
schedule
02.10.2009
Доступ к коллекции форм напрямую выглядит неодобрительно. Ниже приведен пример проекта MVC4, в котором у меня есть настраиваемый шаблон Razor EditorTemplate, который фиксирует дату и время в отдельных полях формы. Настраиваемое связующее извлекает значения отдельных полей и объединяет их в 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);
}
}
person
David Clarke
schedule
28.01.2014
Используйте bindingContext.ValueProvider (и bindingContext.ValueProvider.TryGetValue и т. Д.), Чтобы напрямую получать значения.
person
Craig Stuntz
schedule
02.10.2009