Есть два @Html.DropDownListFor(), один из которых предполагает выбор даты, а второй - времени события. Подскажите, пожалуйста, возможно ли с помощью razor-а передать два значения в качестве одной строки в контроллер из представления? Т.е. получить в результате в контроллере одну переменную формата, например, "MM/dd/yyyy/HH/mm/ss", при том что из отдельных DropDownListFor() берутся дата: "MM/dd/yyyy" и время: "HH/mm/ss".
Возможно ли собрать эти строки вместе и передать в метод контроллера как одну строку?
Ответ
Вам нужна кастомная привязка модели. Механизм привязки модели в asp.net достаточно умён для простых и для большинства сложных моделей, но в подобных случаях он бессилен. Тут на помощь приходит возможность создания собственных привязчиков модели. Для этого вам потребуется создать класс, реализующий интерфейс IModelBinder. Проще это сделать, унаследовавшись от класса DefaultModelBinder.
Примерно так:
public class DateTimeModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var request = controllerContext.HttpContext.Request;
var date = DateTime.Parse(request.Form.Get("date"));
var time = TimeSpan.Parse(request.Form.Get("time"));
date = DateTime.Today.Add(time);
return date;
}
}
а затем применить указать этот класс в качестве привязчика модели для вашего параметра. Вряд ли вы хотите делать приваязку модели таким образом везде в вашем проекте, поэтому стоит делать это с помощью атрибута для параметра вашего метода. Примерно так:
ActionResult MyAction([ModelBinder(typeof(DateTimeModelBinder))] DateTime arg)
Комментариев нет:
Отправить комментарий