@Html でこれらを作成できないのはなぜですか。独自の拡張メソッド (以下を参照) を作成する場合は、それを実行する必要があります。
public static class HtmlHelperExtensions
{
public static MvcHtmlString MyCheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool>> expression, object htmlLabelAttributes = null, object htmlCheckBoxAttributes = null)
{
var checkbox = htmlHelper.CheckBoxFor(expression, htmlCheckBoxAttributes);
var labelTag = new TagBuilder("label");
labelTag.AddCssClass("checkbox");
labelTag.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlLabelAttributes));
labelTag.InnerHtml = checkbox.ToString();
return new MvcHtmlString(labelTag.ToString());
}
}
編集:
この改訂版はどうですか。これは、ラベルが行うことを正確に複製します。
public static class HtmlHelperExtensions
{
public static MvcHtmlString MyCheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool>> expression, object htmlLabelAttributes = null, object htmlCheckBoxAttributes = null)
{
var checkbox = htmlHelper.CheckBoxFor(expression, htmlCheckBoxAttributes);
var labelTag = new TagBuilder("label");
var checkboxName = ExpressionHelper.GetExpressionText(expression);
labelTag.AddCssClass("checkbox");
labelTag.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlLabelAttributes));
labelTag.InnerHtml = checkbox.ToString() + LabelHelper(ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData), checkboxName);
return new MvcHtmlString(labelTag.ToString());
}
private static MvcHtmlString LabelHelper(ModelMetadata metadata, string fieldName)
{
string labelText;
var displayName = metadata.DisplayName;
if (displayName == null)
{
var propertyName = metadata.PropertyName;
labelText = propertyName ?? fieldName.Split(new[] { '.' }).Last();
}
else
{
labelText = displayName;
}
if (string.IsNullOrEmpty(labelText))
{
return MvcHtmlString.Empty;
}
return new MvcHtmlString(labelText);
}
}
MVC 4 には DisplayNameFor Helper があることに注意してください。これにより、ラベル ビジネス全体が少し簡素化されます。