自定义 Html.LabelFor
Customizing Html.LabelFor
我想在我的标签中添加一些 类,所以我在 Shared/EditorTemplates
文件夹下添加了 Label.cshtml
。 Razor 似乎忽略了它。我也试过 DisplayTemplates
文件夹,但也没用。
我可以有标签的编辑器模板吗?如果不是,自定义它们的最佳方式是什么?
Label.cshtml:
@model object
@Html.LabelFor(m => m, new { @class = "col-xs-4 control-label" })
更新:
这是我从 this post and with some changes from this useful link 获取的代码。它仍然不起作用,我不知道发生了什么。有人可以帮忙吗?
public static class Extensions
{
public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
{
return LabelFor(html, expression, new RouteValueDictionary(htmlAttributes));
}
public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
return LabelFor(html, expression, null);
}
public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, IDictionary<string, object> htmlAttributes){
ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
string FieldName = ExpressionHelper.GetExpressionText(expression);
string LabelText = metaData.DisplayName ?? metaData.PropertyName ?? FieldName.Split('.').Last();
if (string.IsNullOrEmpty(LabelText))
return MvcHtmlString.Empty;
TagBuilder tag = new TagBuilder("label");
tag.MergeAttributes(htmlAttributes);
tag.SetInnerText(LabelText);
tag.Attributes.Add("for", html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(FieldName));
tag.Attributes.Add("class", "control-label col-xs-2");
return MvcHtmlString.Create(tag.ToString());
}
}
EditorTemplate and DisplayTemplate are based on property type. You'd do this by creating your own HTML helper.
public static class LabelExtensions
{
public static string Label(this HtmlHelper helper, string target, string text)
{
return String.Format("<label for='{0}'>{1}</label>", target, text);
}
}
EditorTemplate
是基于 属性 的类型(而不是它们生成的 html 元素)。您需要创建自己的 html 助手
public static MvcHtmlString BootstrapLabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
{
var attributes = new { @class = "col-xs-4 control-label" };
return helper.LabelFor(expression, attributes);
}
并在视图中使用它作为
@Html.BootstrapLabelFor(m => m.yourProperty)
然而,这似乎是一种不灵活的使用助手的方式,只是为了节省在标准 LabelFor()
助手中添加 html 属性。根据 this answer 将关联的文本框和验证消息组合到一个助手中可能更有用(请注意,此答案还显示了如何将命名空间添加到 web.config
文件
我想在我的标签中添加一些 类,所以我在 Shared/EditorTemplates
文件夹下添加了 Label.cshtml
。 Razor 似乎忽略了它。我也试过 DisplayTemplates
文件夹,但也没用。
我可以有标签的编辑器模板吗?如果不是,自定义它们的最佳方式是什么?
Label.cshtml:
@model object
@Html.LabelFor(m => m, new { @class = "col-xs-4 control-label" })
更新:
这是我从 this post and with some changes from this useful link 获取的代码。它仍然不起作用,我不知道发生了什么。有人可以帮忙吗?
public static class Extensions
{
public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
{
return LabelFor(html, expression, new RouteValueDictionary(htmlAttributes));
}
public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
return LabelFor(html, expression, null);
}
public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, IDictionary<string, object> htmlAttributes){
ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
string FieldName = ExpressionHelper.GetExpressionText(expression);
string LabelText = metaData.DisplayName ?? metaData.PropertyName ?? FieldName.Split('.').Last();
if (string.IsNullOrEmpty(LabelText))
return MvcHtmlString.Empty;
TagBuilder tag = new TagBuilder("label");
tag.MergeAttributes(htmlAttributes);
tag.SetInnerText(LabelText);
tag.Attributes.Add("for", html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(FieldName));
tag.Attributes.Add("class", "control-label col-xs-2");
return MvcHtmlString.Create(tag.ToString());
}
}
EditorTemplate and DisplayTemplate are based on property type. You'd do this by creating your own HTML helper.
public static class LabelExtensions
{
public static string Label(this HtmlHelper helper, string target, string text)
{
return String.Format("<label for='{0}'>{1}</label>", target, text);
}
}
EditorTemplate
是基于 属性 的类型(而不是它们生成的 html 元素)。您需要创建自己的 html 助手
public static MvcHtmlString BootstrapLabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
{
var attributes = new { @class = "col-xs-4 control-label" };
return helper.LabelFor(expression, attributes);
}
并在视图中使用它作为
@Html.BootstrapLabelFor(m => m.yourProperty)
然而,这似乎是一种不灵活的使用助手的方式,只是为了节省在标准 LabelFor()
助手中添加 html 属性。根据 this answer 将关联的文本框和验证消息组合到一个助手中可能更有用(请注意,此答案还显示了如何将命名空间添加到 web.config
文件