public DateofBirthControl(ControlModel <DateTime?> model) { var dayName = model.Name + "-" + "day"; var monthName = model.Name + "-" + "month"; var yearName = model.Name + "-" + "year"; model.AddRule("dob", "Please enter a valid date of birth.", RuleType.DataAttribute); var dayModel = new ControlModel <int?>(dayName, dayName, model.Value?.Day, "Day", model.Rules, LabelOption.Hide); var monthModel = new ControlModel <string>(monthName, monthName, model.Value?.Month.ToString("D2"), "Month", model.Rules, LabelOption.Hide); var yearModel = new ControlModel <int?>(yearName, yearName, model.Value?.Year, "Year", model.Rules, LabelOption.Hide); Inner = new ControlHolder().AddClass("js-dob") .Append(new Label <DateTime?>(new ControlModel <DateTime?>(dayName, dayName, model.Value, model.DisplayName, model.Rules, model.LabelOption))) .Append(new HtmlTag("div", tag => tag.AddClass("ctrls")) .Append(new TextboxControl <int?>(dayModel, hideStatusMessage: true).Attribute("maxlength", "2").Placeholder("DD").AddClass("width-date-day").Inner) .Append(new SelectControl <string>(monthModel, Months, hideStatusMessage: true).AddClass("width-date-month").Inner) .Append(new TextboxControl <int?>(yearModel, hideStatusMessage: true).Attribute("maxlength", "4").Placeholder("YYYY").AddClass("width-date-year").Inner) // hidden field gets populated by javaScript and is what is POSTED back .Append(new HiddenTag().Name(model.Name).Id(model.Name).Data("dob-bind-value", "DD MMM YYYY").Value(model.Value?.ToString("dd MMM yyyy") ?? "")) ).Append(new StatusMessage()); }