Câu hỏi Truy cập thuộc tính displayName từ mô hình trong Chế độ xem MVC


Nếu mô hình của tôi có

[DisplayName("First Name")]
public string firstName { get; set; }

Sau đó, tôi có thể in nó trong View with LabelFor

@Html.LabelFor(model => model.acc_first)

Sau đó, nó sẽ hiển thị dưới dạng

<label for="firstName">First Name</label>
  • Nhưng làm thế nào tôi có thể "thô" đọc thuộc tính (FirstName) thuộc tính trong Chế độ xem? Ví dụ: nếu tôi muốn gửi giá trị cho một hàm trên trang Xem

25
2017-09-14 15:10


gốc


Bạn nên chấp nhận một trong các câu trả lời dưới đây. - David Kennedy


Các câu trả lời:


@Html.DisplayNameFor(x => x.acc_first)

38
2017-12-13 03:14





Để truy cập các thuộc tính, bạn sẽ cần một tùy chỉnh Html người giúp đỡ. Vì các thuộc tính không thực sự là một phần của thuộc tính hoặc mô hình, bạn cần phải đi vòng quanh để truy cập chúng.

public static IHtmlString DisplayName<TModel, TValue>(
                             this HtmlHelper<TModel> html,
                             Expression<Func<TModel, TValue>> expression) {
    var metadata = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);

    return new HtmlString(metadata.DisplayName);
}

Đối với các thuộc tính bổ sung không thuộc DataAnnotations, bạn có thể thực hiện các thao tác sau:

Tạo thuộc tính tùy chỉnh

public class TooltipAttribute : Attribute, IMetadataAware {
    public TooltipAttribute(string tooltip) {
        this.Tooltip = tooltip;
    }

    public string Tooltip { get; set; }

    public void OnMetadataCreated(ModelMetadata metadata) {
        metadata.AdditionalValues["Tooltip"] = this.Tooltip;
    }
}

Phép thuật xảy ra trong triển khai OnMetadataCreated. Ở đây chúng ta có thể điền vào các AdditionalValues ​​với bất cứ thứ gì chúng ta cần cho Thuộc tính cụ thể của chúng ta. Trong trường hợp này, chúng tôi sẽ thêm khóa chú giải công cụ. Tên của bạn phải là duy nhất như các thuộc tính hoặc nhà cung cấp khác có thể thêm các khóa riêng của họ với cùng một tên Điều quan trọng là phải nhớ rằng các thuộc tính không phải lúc nào cũng được đọc theo cùng một thứ tự. Vì vậy, thuộc tính tooltip của bạn có thể được gọi là đầu tiên, cuối cùng hoặc một nơi nào đó ở giữa. Đây là một sự khác biệt quan trọng vì nó có thể gây ra các hiệu ứng không mong muốn.

Sau đó, tạo một trình trợ giúp thuộc tính tùy chỉnh

public static IHtmlString TooltipFor<TModel, TValue>(
                             this HtmlHelper<TModel> html,
                             Expression<Func<TModel, TValue>> expression) {
    var metadata = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);
    if (metadata.AdditionalValues.ContainsKey("Tooltip"))
        return new HtmlString((string)metadata.AdditionalValues["Tooltip"]);

    return new HtmlString("");
}

13
2017-09-14 15:49



Đúng thứ tôi cần. Tôi sử dụng ví dụ đầu tiên của bạn và nó hoạt động rất tốt. Cảm ơn! :) - haagel
Tôi đang cố gắng sử dụng ví dụ của bạn dưới dạng @ Html.TooltipFor (model => model.Name) và tiếp tục nhận được lỗi: Đối số kiểu cho phương thức không thể được suy ra từ việc sử dụng, hãy thử xác định các đối số. - bugrasitemkar


Bạn có thể truy cập giá trị của thuộc tính Display(Name="...") trong 4 bước:

var type = typeof(YourNamespace.Models.YourModelName);
var memInfo = type.GetMember("firstName"); // your member
var attributes = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), false);
var displayname = ((System.ComponentModel.DataAnnotations.DisplayAttribute)attributes[0]).Name;

Sau đó displayname sẽ có giá trị First Name trong bối cảnh của bạn.


5
2017-11-27 13:22





Xây dựng trên câu trả lời của Darren Oster:

@Html.DisplayNameFor(x => x.acc_first)

Đây là một liên kết đến tài liệu này: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.displaynameextensions.displaynamefor(v=vs.118).aspx

Bạn có thể sử dụng điều này trong mã xem của bạn như sau:

@{ 
    var foo = Html.DisplayNameFor(x => x.acc_first);

    // call function
    DoStuff(foo);
}

1
2017-07-25 01:51





bạn chỉ nên sử dụng

[Display(Name = "First Name")]


 public string name{ get; set; }

0
2018-01-25 12:24





@(This.Model.acc_first)

Nên làm việc

vì vậy trong javascript bạn có thể sử dụng nó như

function callme(val)
{
   //some ajax call with 
   @(This.Model.acc_first)
}

-2
2017-09-14 15:19



Câu hỏi đặt ra là hỏi về Tên hiển thị của thuộc tính (từ DisplayNameAttribute), không phải là giá trị của thuộc tính. - Darren Oster


@Html.DisplayFor(model => model.acc_first)

nên làm việc cho bạn. Nếu không, hãy thử

@Model.acc_first

Hoặc là một trong những nên làm việc tốt.


-2
2017-09-14 17:18



Câu hỏi đặt ra là hỏi về Tên hiển thị của thuộc tính (từ DisplayNameAttribute), không phải là giá trị của thuộc tính. - Darren Oster