Объединить параметры POST в одно свойство в моей модели представления - PullRequest
0 голосов
/ 22 июля 2011

В моей регистрационной форме я должен разрешить пользователю указать дату своего рождения. Требуется, чтобы я показывал SELECT для дня, SELECT для месяца и SELECT для года.

Я разработал вспомогательное расширение Html, которое создает эту схему и называет элементы управления propertyName+".day", propertyName+".month" и propertyName+".year".

Идея состоит в том, что в моей модели представления я определяю свойство DateTime и затем вызываю этого помощника: @Html.DateSelect(m=>m.DateOfBirth), но проблема в том, что я не знаю, как объединить предыдущие 3 свойства в DateTime снова.

Я бы получил 3 параметра POST с именами dateofbirth.day, dateofbirth.month и dateofbirth.year.

Как это будет сделано в MVC3?

Спасибо

Ответы [ 2 ]

2 голосов
/ 22 июля 2011
1 голос
/ 22 июля 2011

Вам нужно будет использовать пользовательское связующее для моделей:

public class SplitDateTimeBinder : IModelBinder 
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {

        ValueProviderResult day = bindingContext.ValueProvider.GetValue("propertyName.day");
        ValueProviderResult month = bindingContext.ValueProvider.GetValue("propertyName.month");
        ValueProviderResult year = bindingContext.ValueProvider.GetValue("propertyName.year");

        DateTime result = new DateTime(int.Parse(year), int.Parse(month), int.Parse(day));

        return user;
    }
}

и зарегистрировать его в Global.asax:

ModelBinders.Binders.Add(typeof(DateTime), new SplitDateTimeBinder());

Я использовал int.Parse() в этом примере, но вы, вероятно, захотите использовать int.TryParse() и правильно обрабатывать неудачные разборы.

...