Tôi đã mở rộng trình trợ giúp HTML bằng một phương thức cần giá trị thuộc tính từ thuộc tính của mô hình. Vì vậy, tôi đã xác định một thuộc tính tùy chỉnh như vậy.Không thể nhận giá trị thuộc tính tùy chỉnh trong Trình trợ giúp HTML MVC3
public class ChangeLogFieldAttribute : Attribute {
public string FieldName { get; set; }
}
Nó được sử dụng như thế này trong mô hình của tôi.
[Display(Name = "Style")]
[ChangeLogField(FieldName = "styleid")]
public string Style { get; set; }
Trong phương thức trợ giúp của tôi, tôi có mã sau để lấy giá trị FieldName thuộc tính của tôi, nếu thuộc tính được sử dụng cho thuộc tính.
var itemName = ((MemberExpression)ex.Body).Member.Name;
var containerType = html.ViewData.ModelMetadata.ContainerType;
var attribute = ((ChangeLogFieldAttribute[])containerType.GetProperty(html.ViewData.ModelMetadata.PropertyName).GetCustomAttributes(typeof(ChangeLogFieldAttribute), false)).FirstOrDefault();
if (attribute != null) {
itemName = attribute.FieldName;
}
Tuy nhiên, khi tôi đạt đến mã này, tôi nhận được ngoại lệ vì loại vùng chứa là null.
Tôi không chắc liệu tôi có thực hiện bất kỳ điều gì đúng hay không, nhưng tôi đã lấy từ khoảng 4 nguồn khác nhau để đạt được điều này. Nếu bạn có thể đề nghị một sửa chữa cho vấn đề của tôi hoặc một sự thay thế, tôi sẽ biết ơn.
Cảm ơn.
CẬP NHẬT VỚI GIẢI PHÁP
tôi đã sử dụng giải pháp Darin Dimitrov, mặc dù tôi đã phải tinh chỉnh nó một số. Đây là những gì tôi đã thêm vào. Tôi phải kiểm tra sự tồn tại của metatdata thuộc tính và tất cả đều tốt.
var fieldName = ((MemberExpression)ex.Body).Member.Name;
var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData);
if (metadata.AdditionalValues.ContainsKey("fieldName")) {
fieldName = (string)metadata.AdditionalValues["fieldName"];
}
Để có được một tên thuộc tính, bạn có thể sử dụng 'metadata.PropertyName' thay vì '((MemberExpression) ex.Body) .Member.Name'. Tuy nhiên, điều này không hoạt động đối với tên trường và tôi không thấy bất kỳ '.FieldName' hoặc' .MemberName' nào. –