在我被 Bootstrap 2 升级到 3 升级后,他们几乎完全改变了表单控件的 HTML,我一直将整个表单组放在编辑器模板中,而不仅仅是字段。这是一个例子:
<div class="form-group">
@Html.Label("", new { @class = string.Format("control-label col-md-2{0}", ViewData.ModelMetadata.IsRequired ? string.Empty : " optional") })
<div class="col-md-6">
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue.ToString(), new { type = "email", @class = "form-control" })
@Html.ValidationMessage("")
</div>
</div>
这里对您来说重要的是Html.Label 中的string.Format。如果它是假的,我正在使用ViewData.ModelMetadata.IsRequired 添加一个“可选”类。默认情况下,Bootstrap 将标签设为粗体,因此作为必需的指示符,我将可选字段标签设为正常(非粗体)。但是,添加* 有点困难。你可以使用我在这里做的同样的事情来添加一个额外的跨度标签:
@if (ViewData.ModelMetadata.IsRequired)
{
<span class="requiredIndicator>*</span>
}
@Html.Label(...)
...
潜在的问题是它实际上不会在您的<label> 标记内部,因此您可能需要做一些额外的样式工作以使其看起来正确,具体取决于您应用的样式标签。
另一种方法是创建您自己的 HtmlHelper 以返回带有所需指示符的标签。下面是一些示例代码:
public static MvcHtmlString RequiredIndicatorLabelFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> modelProperty,
object htmlAttributes)
{
var metadata = ModelMetadata.FromLambdaExpression(modelProperty, html.ViewData);
var labelText = metadata.IsRequired ? string.Format("* {0}", metadata.GetDisplayName()) : metadata.GetDisplayName();
return html.LabelFor(modelProperty, labelText, htmlAttributes);
}