Получить FormCollection из controllerContext для привязки пользовательской модели - PullRequest
8 голосов
/ 02 октября 2009

У меня была хорошая функция, которая взяла мой FormCollection (предоставленный из контроллера). Теперь я хочу сделать связывание модели вместо этого, и мой связыватель модели вызовет эту функцию, и для этого требуется FormCollection. По какой-то причине я могу найти это. Я думал, что это было бы controllerContext.HttpContext.Request.Form

Ответы [ 3 ]

15 голосов
/ 02 октября 2009

Попробуйте это:

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

FormCollection - это тип, который мы добавили в ASP.NET MVC, который имеет собственный ModelBinder. Вы можете посмотреть на код FormCollectionBinderAttribute, чтобы понять, что я имею в виду.

1 голос
/ 29 января 2014

Прямой доступ к коллекции форм, по-видимому, вызывает недовольство. Ниже приведен пример из проекта 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);
    }
}
0 голосов
/ 02 октября 2009

Используйте bindingContext.ValueProvider (и bindingContext.ValueProvider.TryGetValue и т. Д.) Для получения значений напрямую.

...