2

Thông thường chúng ta có một số trường bắt buộc trên biểu mẫu của mình và thật tuyệt nếu chế độ xem ASP.NET MVC có thể tự động phát hiện các trường đó và hiển thị dấu hoa thị màu đỏ đẹp sau nhãn trường. Vì chức năng này không được xây dựng nên tôi đã xây dựng giải pháp của riêng mình dựa trên các chú thích dữ liệu . Trong bài đăng này, tôi sẽ chỉ cho bạn cách hiển thị dấu hoa thị màu đỏ sau nhãn của các trường bắt buộc.

Dưới đây là các nguồn thông tin chính tôi đã sử dụng khi thực hiện giải pháp của riêng mình:

Mặc dù mã của tôi lần đầu tiên được viết cho tình huống hoàn toàn khác nhưng tôi cần nó sau và tôi đã sửa đổi nó để hoạt động với các mô hình sử dụng chú thích dữ liệu. Nếu thành viên dữ liệu của mô hình có thuộc tính Bắt buộc được đặt thì dấu hoa thị sẽ được hiển thị sau trường. Nếu thuộc tính Bắt buộc bị thiếu thì sẽ không có dấu hoa thị.

Đây là mã của tôi. Bạn chỉ có thể sử dụng các phương thức LabelForRequired () và dán chúng vào lớp mở rộng HTML của riêng bạn.

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<><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);
    }
}</tmodel,></tmodel></tmodel,>

Và đây là cách sử dụng phương thức tiện ích mở rộng LabelForRequired trong chế độ xem của bạn:

<div class="field">
    @Html.LabelForRequired(m => m.Name)
    @Html.TextBoxFor(m => m.Name)
    @Html.ValidationMessageFor(m => m.Name)
</div> 

Sau khi chơi với kiểu CSS được gọi là .required mẫu ví dụ của tôi trông như thế này:

Những dấu sao màu đỏ này không phải là một phần của đánh dấu xem ban đầu. Phương thức LabelForRequired đã phát hiện ra rằng các thuộc tính này có tập thuộc tính Bắt buộc và hiển thị dấu hoa thị sau tên trường.

Lưu ý! Theo mặc định, các dấu sao không có màu đỏ. Bạn phải định nghĩa lớp CSS có tên là bắt buộc phải có tên lửa để sửa đổi dấu hoa thị và vị trí của nó.

|