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