The following works for me.
Model:
public enum AmPmEnum { Am, Pm } public class TimePicker { public TimeSpan Time { get; set; } public AmPmEnum AmPm { get; set; } } public class MainModel { public TimePicker TimePickerField { get; set; } }
Controller:
public class HomeController : Controller { public ActionResult Index() { var model = new MainModel { TimePickerField = new TimePicker { Time = TimeSpan.FromHours(1), AmPm = AmPmEnum.Pm } }; return View(model); } [HttpPost] public ActionResult Index(MainModel model) { return View(model); } }
View ( ~/Views/Home/Index.cshtml ):
@model MainModel @using (Html.BeginForm()) { @Html.EditorFor(x => x.TimePickerField) <button type="submit">OK</button> }
A custom editor template ( ~/Views/Shared/EditorTemplates/TimePicker.cshtml ), which combines the properties of Time and AmPm in one input field and for the subsequent subsequent splitting into them, a custom connecting device will be required.
@model TimePicker @Html.TextBox("_picker_", string.Format("{0} {1}", Model.Time, Model.AmPm))
and model binder:
public class TimePickerModelBinder : IModelBinder { public object BindModel( ControllerContext controllerContext, ModelBindingContext bindingContext ) { var key = bindingContext.ModelName + "._picker_"; var value = bindingContext.ValueProvider.GetValue(key); if (value == null) { return null; } var result = new TimePicker(); try {
and finally register your connecting device in Application_Start :
ModelBinders.Binders.Add(typeof(TimePicker), new TimePickerModelBinder());
source share