2012-10-17 26 views
21

này làm việc cho grabbing các tiêu đề (KHÔNG GIÁ TRỊ):Calling quá tải IEnumerable của DisplayNameFor

@model IEnumerable<SomeModel> 
... 
<th>@Html.DisplayNameFor(m => m.SomeModelProperty)</th> 

Mà nếu SomeModelProperty là:

[Display(Name = "An Excellent Header")] 
SomeModelProperty { get; set; } 

Sau đó, nó sẽ hiển thị "Một header Tuyệt vời" trong phần tử header th.

Bạn sẽ nghĩ điều này sẽ không làm việc vì mô hình này là IEnumerable, trong đó sẽ không có một m.SomeModelProperty, nhưng nó hoạt động vì HtmlHelper có HtmlHelper<IEnumerable<TModel>> như vậy mà các tham số của lambda là TModel, không IEnumerable<TModel>. Vì điều này chỉ sử dụng siêu dữ liệu, nên không cần một mục từ bộ sưu tập. (Mặc dù intellisense trên m. sẽ nói dối bạn và làm cho bạn nghĩ rằng đó là một bộ sưu tập). Tôi không chắc chắn khi quá tải này mát mẻ đã được thêm vào, nhưng là khá tiện dụng cho Index.cshtml và không đi với những điều funky như @Html.DisplayNameFor(m => @Model.FirstOrDefault().SomeModelProperty) mà tôi muốn tránh.

http://msdn.microsoft.com/en-us/library/hh833697(v=vs.108).aspx

Tuy nhiên, tôi không thể tìm ra cách để có được điều này để làm việc khi mô hình của tôi không phải là IEnumerable, nhưng thay vì chứa IEnumerable như một thuộc tính, chẳng hạn như:

public class SomeList 
{ 
    public List<SomeModel> SomeModels { get; set; } 
    public int Page { get; set; } 
    public DateTime CurrentAsOf { get; set; } 
} 

tôi hy vọng sẽ được rõ ràng với các thông số loại chung chung, nhưng tôi nghĩ rằng các thông số loại được xác định bởi động cơ mà trickles xuống từ HtmlHelper tạo ra với trang. Tôi có thể khai báo một HtmlHelper mới trong trang, hoặc bằng cách nào đó xác định các thông số kiểu một cách rõ ràng?

Index.cshtml:

@model SomeList 
//No idea how to do this: 
@Html.DisplayNameFor<IEnumerable<SomeModel>>(m => m.SomeModelProperty) 
+2

Trong mã vòng lặp của bạn trong tệp Dao cạo, bạn có thể kiểm tra xem đó có phải là phần tử ** đầu tiên ** trong vòng lặp hay không và xuất phần '' bằng cách sử dụng lệnh 'DisplayNameFor'. Điều này 'if' sẽ là trước khi bạn xuất dữ liệu trong một' tr'. – Gromer

+1

Có Tôi đã sử dụng những cách giải quyết này với hy vọng sẽ di chuyển khỏi hiện tại mà DisplayNameFor hỗ trợ nhận siêu dữ liệu từ IEnumerable – AaronLS

+0

Câu hỏi này có giải pháp tốt và làm việc (câu trả lời được chấp nhận): http://stackoverflow.com/questions/20807869/displaynamefor-from-listobject-in-model – lxa

Trả lời

38

Một workaround tương tự mà làm việc ngay cả khi không có các hàng có thể là:

... 
@{var dummy = Model.FirstOrDefault(); } 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => dummy.SomeModelProperty) 
     </th> 
... 
+4

Cuộc gọi không rõ ràng giữa các phương thức hoặc thuộc tính sau: 'System.Web.Mvc.Html.DisplayNameExtensions.DisplayNameFor (System.Web.Mvc. HtmlHelper >, System.Linq.Expressions.Expression >) 'và' System.Web.Mvc.Html .DisplayNameExtensions.DisplayNameFor , int> ... –

+1

cùng vấn đề như Oleg Sh ... –

+1

Có ai quản lý để giải quyết vấn đề này? – user3407039

5

tôi có chính xác cùng một vấn đề bởi vì tôi đang sử dụng ViewModels vì vậy tôi có một ViewModel với một IEnumerable của các đối tượng thực tế như là một tài sản.

Tôi đã xem qua bài đăng này, nếu bạn kiểm tra câu trả lời, chàng trai đã tạo HTMLHelper của riêng mình để giải quyết vấn đề này http://forums.asp.net/t/1783733.aspx. Phiên bản của anh ấy là:

public static MvcHtmlString DisplayColumnNameFor<TModel, TClass, TProperty>(
    this HtmlHelper<TModel> helper, IEnumerable<TClass> model, 
    Expression<Func<TClass, TProperty>> expression) 
{ 
    var name = ExpressionHelper.GetExpressionText(expression); 
    name = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); 
    var metadata = ModelMetadataProviders.Current.GetMetadataForProperty(
     () => Activator.CreateInstance<TClass>(), typeof(TClass), name); 

    return new MvcHtmlString(metadata.DisplayName); 
} 

Bạn phải chuyển hai đối số liệt kê và biểu thức thay vì biểu thức bình thường để bạn có thể thích câu trả lời @franz. Tôi không thể thấy có được vòng nào phải vượt qua 2 đối số vì nó cần biết thuộc tính nào của mô hình khung nhìn mà bạn đang áp dụng biểu thức.