Tôi đang sử dụng ASP.NET MVC 2 Preview 2 và đã viết phương thức mở rộng tùy chỉnh HtmlHelper để tạo nhãn bằng cách sử dụng biểu thức. TModel là từ một lớp đơn giản với các thuộc tính và các thuộc tính có thể có các thuộc tính để xác định các yêu cầu xác nhận hợp lệ. Tôi đang cố gắng tìm hiểu xem một thuộc tính nào đó có tồn tại trên thuộc tính hay không biểu thức thể hiện trong phương thức nhãn của tôi.Nhận các thuộc tính tùy chỉnh từ Biểu thức thuộc tính Lambda
Mã cho lớp và nhãn là:
public class MyViewModel
{
[Required]
public string MyProperty { get; set; }
}
public static MvcHtmlString Label<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string label)
{
return MvcHtmlString.Create(string.Concat("<label for=\"", expression.GetInputName(), "\">", label, "</label>"));
}
public static string GetInputName<TModel, TProperty>(this Expression<Func<TModel, TProperty>> expression)
{
return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1);
}
Sau đó, tôi sẽ gọi nhãn như thế này:
Html.Label(x => x.MyProperty, "My Label")
Có cách nào để tìm hiểu xem thuộc tính trong giá trị biểu được chuyển đến phương thức Nhãn có thuộc tính Bắt buộc?
Tôi đã tìm ra rằng thực hiện những điều sau đây không cho tôi thuộc tính nếu nó tồn tại, nhưng tôi hy vọng có một cách sạch hơn để thực hiện việc này.
public static MvcHtmlString Label<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string label)
{
System.Attribute.GetCustomAttribute(Expression.Property(Expression.Parameter(expression.Parameters[0].Type, expression.GetInputName()), expression.GetInputName()).Member, typeof(RequiredAttribute))
return MvcHtmlString.Create(string.Concat("<label for=\"", expression.GetInputName(), "\">", label, "</label>"));
}
này là tốt hơn nhiều, cảm ơn! Có thể thay đổi GetAttribute thành một phương thức mở rộng của Expression không? Điều đó sẽ cho phép dễ dàng kiểm tra bất kỳ biểu thức nào cho một thuộc tính. – Bernd
+1 Người viết mã tuyệt vời! Tôi sẽ đề cập đến điều này trong cuốn sách "ASP.NET MVC Cookbook" (http://groups.google.com/group/aspnet-mvc-2-cookbook-review) –
Vì vậy, tôi đã sử dụng giải pháp này trong một thời gian dài, nhưng gần đây xem lại nó khi làm việc với 'DbSet.Include' của EntityFramework, không tải đúng các thuộc tính lồng nhau (ví dụ' Thing1.Thing2' của 'o => o.Thing1.Thing2'). Có một [phiên bản mạnh hơn một chút] (http://stackoverflow.com/a/2916344/1037948) của bạn có tính đến "UnaryExpression', nhưng chuyển đổi chuỗi bạn đề xuất tránh [có vẻ là cách dễ nhất] (http : //stackoverflow.com/a/17220748/1037948) để nhận tên "đủ điều kiện". – drzaus