为什么你不能用@Html创建这些.如果你编写自己的扩展方法(见下文),应该这样做吗?
public static class HtmlHelperExtensions
{
public static MvcHtmlString MyCheckBoxFor(this HtmlHelper htmlHelper,Expression> 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(this HtmlHelper htmlHelper,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,所以整个标签业务可以简化一下.