asp.net mvc - строго типизированная модель представления с множественным выбором - PullRequest
6 голосов
/ 06 января 2010

Я хотел бы знать, как связать значения моей формы со строго типизированным представлением из поля MultiSelect.

Очевидно, что при отправке формы поле множественного выбора отправит строку с выбранными значениями с разделителями, что является лучшим способом преобразовать эту строку значений обратно в список объектов, которые необходимо прикрепить к моей модели, которая будет обновлена.

public class MyViewModel {
    public List<Genre> GenreList {get; set;}
    public List<string> Genres { get; set; }
}

При обновлении моей модели внутри контроллера я использую UpdateModel, как показано ниже:

Account accountToUpdate = userSession.GetCurrentUser();
UpdateModel(accountToUpdate);

Однако мне нужно каким-то образом получить значения из строки обратно в объекты.

Я полагаю, что это может иметь какое-то отношение к моделям, но я не могу найти хороших четких примеров того, как это сделать.

Спасибо !! Пол

Ответы [ 2 ]

3 голосов
/ 15 декабря 2010

Вы правы в том, что модель связующего - это путь. Попробуйте это ...

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

[ModelBinder(typeof(MyViewModelBinder))]
public class MyViewModel {
    ....
}

public class MyViewModelBinder : DefaultModelBinder {
    protected override void SetProperty(ControllerContext context, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value) {
        if (propertyDescriptor.Name == "Genres") {
            var arrVals = ((string[])value)[0].Split(',');
            base.SetProperty(context, bindingContext, propertyDescriptor, new List<string>(arrVals));
        }
        else
            base.SetProperty(context, bindingContext, propertyDescriptor, value);
    }
}
0 голосов
/ 15 декабря 2010

Проверьте Сообщение в блоге Фила Хаака на эту тему. Я использовал это в качестве основы для множественного выбора строго типизированного представления в недавнем проекте.

...