原文地址:http://weblogs.asp.net/gunnarpeipman/archive/2012/06/17/asp-net-mvc-how-to-show-asterisk-after-required-field-label.aspx

  免责申明:本文为翻译,仅用于学习交流,版权归原作者所有 (Gunnar Peipman)

  更多说明:本着自学加深记忆之目的翻译此文,不用于任何商业用途

 

  ASP.NET MVC-如何在必须字段标签后显示*号

  在表单里经常有一些必填字段,如果ASP.NET MVC 视图能自动发现这些字段并在字段标签后显示红色的*号那就太棒啦.因为ASP.NET MVC里并有这个功能,因此我自己实现了基于数据通知的解决方案.这篇贴子我将教你如何在必填标签后显示红色的*号.

  下面是我找到自己解决方案时参考的主要信息资源:

  尽管我的代码开始为的是完全不同于我后面需要的情况,我将它修改成使用数据通知来和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 in action

  红色的*号并不是原始视图标记的一部分.LabelForRequired方法发现属性中包含Required属性就在字段名后显示*号.

  NB!默认*号并不是红色的.你还需要定义名为“required”的CSS类来修改*号的样式和位置.

 

 

 

 posted on 2012-06-28 15:54  Walking Dead  阅读(206)  评论(0)    收藏  举报