免责申明:本文为翻译,仅用于学习交流,版权归原作者所有 (Gunnar Peipman)
更多说明:本着自学加深记忆之目的翻译此文,不用于任何商业用途
ASP.NET MVC-如何在必须字段标签后显示*号
在表单里经常有一些必填字段,如果ASP.NET MVC 视图能自动发现这些字段并在字段标签后显示红色的*号那就太棒啦.因为ASP.NET MVC里并有这个功能,因此我自己实现了基于数据通知的解决方案.这篇贴子我将教你如何在必填标签后显示红色的*号.
下面是我找到自己解决方案时参考的主要信息资源:
- How can I modify LabelFor to display an asterisk on required fields? (stackoverflow)
- ASP.NET MVC – Display visual hints for the required fields in your model (Radu Enucă)
尽管我的代码开始为的是完全不同于我后面需要的情况,我将它修改成使用数据通知来和models一起工作.数据实体的数据成员有一个Required attribute设置,那么就会在字段后面显示一个*号.如果没有就不会有*号显示.
下面是我的代码,你可以将LabelForRequired()方式复制到你自己的HTML扩展类中.
public static class HtmlExtensions
{
[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")]
public static MvcHtmlString LabelForRequired<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string labelText = "")
{
return LabelHelper(html,
ModelMetadata.FromLambdaExpression(expression, html.ViewData),
ExpressionHelper.GetExpressionText(expression), labelText);
}
private static MvcHtmlString LabelHelper(HtmlHelper html,
ModelMetadata metadata, string htmlFieldName, string labelText)
{
if (string.IsNullOrEmpty(labelText))
{
labelText = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();
}
if (string.IsNullOrEmpty(labelText))
{
return MvcHtmlString.Empty;
}
bool isRequired = false;
if (metadata.ContainerType != null)
{
isRequired = metadata.ContainerType.GetProperty(metadata.PropertyName)
.GetCustomAttributes(typeof(RequiredAttribute), false)
.Length == 1;
}
TagBuilder tag = new TagBuilder("label");
tag.Attributes.Add(
"for",
TagBuilder.CreateSanitizedId(
html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)
)
);
if (isRequired)
tag.Attributes.Add("class", "label-required");
tag.SetInnerText(labelText);
var output = tag.ToString(TagRenderMode.Normal);
if (isRequired)
{
var asteriskTag = new TagBuilder("span");
asteriskTag.Attributes.Add("class", "required");
asteriskTag.SetInnerText("*");
output += asteriskTag.ToString(TagRenderMode.Normal);
}
return MvcHtmlString.Create(output);
}
}
下面是在view中如何来使用LabelForRequired扩展方法:
<div class="field">
@Html.LabelForRequired(m => m.Name)
@Html.TextBoxFor(m => m.Name)
@Html.ValidationMessageFor(m => m.Name)
</div>
结合名为.required的CSS样式,我的示例如下:

红色的*号并不是原始视图标记的一部分.LabelForRequired方法发现属性中包含Required属性就在字段名后显示*号.
NB!默认*号并不是红色的.你还需要定义名为“required”的CSS类来修改*号的样式和位置.
posted on
浙公网安备 33010602011771号