有没有办法在[必填]字段旁边自动显示“*”所需图标

时间:2014-05-01 13:23:17

标签: asp.net-mvc asp.net-mvc-4 razor

我已经完成了我的asp.net MVC Web应用程序,并且我一直在使用数据注释[必需]来提及该字段是必需的。但是,除非用户尝试提交表单,否则目前必填字段没有任何迹象表明它们是必需的。那么有没有办法强制我的Razor视图在任何已定义[必需]的字段旁边显示红色“”?或者我需要手动添加“”图标? 感谢

2 个答案:

答案 0 :(得分:2)

在我被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>

这里重要的是string.Format中的Html.Label。如果它是假的,我正在使用ViewData.ModelMetadata.IsRequired添加“可选”类。默认情况下,Bootstrap使标签变为粗体,因此作为必需的指示符,我使可选字段标签正常(非粗体)。但是,添加*会更困难一些。您可以使用我在这里添加额外span标记的相同内容:

@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);
}

答案 1 :(得分:1)

您也可以为此目的编写自定义标签助手

public static MvcHtmlString CustomLabelFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, 
    IDictionary<string, object> htmlAttributes = null )
{
    var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    var propertyName = ExpressionHelper.GetExpressionText(expression);
    var builder = new TagBuilder("label");
    builder.Attributes.Add("for", TagBuilder.CreateSanitizedId(htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(propertyName)));
    var labelText = string.Format("{0}{1}", metadata.IsRequired ? "*" : string.Empty,
                                  string.IsNullOrEmpty(metadata.DisplayName)
                                      ? metadata.PropertyName
                                      : metadata.DisplayName);
    builder.SetInnerText(labelText);
    builder.MergeAttributes<string, object>(htmlAttributes, true);
    return new MvcHtmlString(builder.ToString());
}

现在,在具有Required属性的属性上使用CustomLabelFor时,它将在标签文本的fort中附加*。

 @Html.CustomLabelFor(m => m.YourRequiredField)