次のように生年月日のカスタムヘルパーを作成しました。
カスタム HTML ヘルパー メソッド
public static MvcHtmlString DateOfBirthFor(this HtmlHelper html, string id ,int minYear, int maxYear, object htmlAttribute = null)
{
RouteValueDictionary attributes = new RouteValueDictionary(htmlAttribute);
var days = Enumerable.Range(1, 31).Select(x => new SelectListItem
{
Value = x.ToString(),
Text = x.ToString()
});
var months = Enumerable.Range(1, 12).Select(x => new SelectListItem
{
Value = x.ToString(),
Text = x.ToString()
});
var years = Enumerable.Range(minYear, maxYear-(minYear-1)).Select(x => new SelectListItem
{
Value = x.ToString(),
Text = x.ToString()
});
var mainDivTag = new TagBuilder("div");
mainDivTag.MergeAttribute("id", id);
mainDivTag.MergeAttributes(attributes);
mainDivTag.InnerHtml = string.Concat(
html.DropDownList("Day", days, new { style="width : 40px "}).ToHtmlString(),
html.DropDownList("Month", months, new { style = "width : 40px " }).ToHtmlString(),
html.DropDownList("Year", years, new { style = "width : 60px " }).ToHtmlString()
);
return new MvcHtmlString(mainDivTag.ToString());
}
同じコントロールのカスタム バインダーも作成しました。
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
{
if (propertyDescriptor.Name == "DateOfBirth")
{
DateTime dob = new DateTime(int.Parse(controllerContext.HttpContext.Request.Form["Year"]), int.Parse(controllerContext.HttpContext.Request.Form["Month"]), int.Parse(controllerContext.HttpContext.Request.Form["Day"]));
propertyDescriptor.SetValue(bindingContext.Model, dob);
}
}
しかし、今度は同じコントロールに対して強力なカスタム ヘルパーを作成する必要があります。したがって、カスタム バインディングを記述する必要はありません。