2011-12-30 25 views
17

Tôi có dòng này trong quan điểm của tôiTại sao DisplayFor không lặp lại thông qua IEnumerable <DateTime> của tôi?

@(Html.DisplayFor(m => m.DaysOfWeek, "_CourseTableDayOfWeek")) 

nơi m.DaysOfWeek là một IEnumerable<DateTime>.

Có nội dung của _CourseTableDayOfWeek.cshtml:

@model DateTime 
@{ 
    ViewBag.Title = "CourseTableDayOfWeek"; 
} 
<th> 
    @System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int) Model.DayOfWeek] 
    <span class="dateString">Model.ToString("G")</span> 
</th> 

Và tôi nhận được lỗi sau:

The model item passed into the dictionary is of type ' System.Collections.Generic.List`1[System.DateTime] ', but this dictionary requires a model item of type ' System.DateTime '.

Nếu tôi tham khảo các bài sau:

https://stackoverflow.com/a/5652524/277067

Các DisplayFor nên lặp qua IEnum có thể xóa và hiển thị mẫu cho mỗi mục, phải không?

Trả lời

23

Nó không lặp vì bạn đã chỉ định tên cho mẫu hiển thị làm đối số thứ hai của trợ giúp DisplayFor (_CourseTableDayOfWeek).

Nó chỉ lặp khi bạn dựa vào ước tức là

@Html.DisplayFor(m => m.DaysOfWeek) 

và sau đó bên ~/Views/Shared/DisplayTemplates/DateTime.cshtml:

@model DateTime 
@{ 
    ViewBag.Title = "CourseTableDayOfWeek"; 
} 
<th> 
    @System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int) Model.DayOfWeek] 
    <span class="dateString">Model.ToString("G")</span> 
</th> 

Khi bạn chỉ định một tên tùy chỉnh cho các mẫu hiển thị (hoặc như là đối số thứ hai của DisplayFor helper hoặc như thuộc tính [UIHint]) nó sẽ không còn vòng lặp cho các thuộc tính thu thập và mẫu sẽ đơn giản được chuyển qua mô hình IEnumerable<T>.

Thật khó hiểu nhưng đó là cách thực hiện. Tôi cũng không thích.

+5

Ok, thật đáng buồn, cảm ơn –

+5

Ditto. Một khía cạnh khác của những người trợ giúp khó gỡ lỗi và hoàn toàn không rõ ràng. – core24

+4

Tôi chỉ rơi vào cùng một cái bẫy.Điều này có vẻ hoàn toàn phản trực giác với tôi. Tôi hy vọng điều này sẽ thay đổi với MVC 4. –

0

Điều này có vẻ giống như một lỗi. Các lớp Helper Html dễ mở rộng, mặc dù sau khi nhìn vào nguồn MVC, tìm lỗi, tôi đã từ bỏ và chỉ tận dụng tiền đề mà các mẫu làm việc cho một mục riêng lẻ, vì vậy tôi đã viết phần mở rộng HtmlHelper kết thúc tốt đẹp cho bạn. Tôi đã đưa ra biểu thức lambda cho sự đơn giản của riêng tôi, nhưng bạn có thể dễ dàng quay trở lại đó. Ví dụ này chỉ dành cho một danh sách các chuỗi.

public static class DisplayTextListExtension 
{ 
    public static MvcHtmlString DisplayForList<TModel>(this HtmlHelper<TModel> html, IEnumerable<string> model, string templateName) 
    { 
     var tempResult = new StringBuilder(); 

     foreach (var item in model) 
     { 
      tempResult.Append(html.DisplayFor(m => item, templateName)); 
     } 

     return MvcHtmlString.Create(tempResult.ToString()); 
    } 
} 

Sau đó, sử dụng thực tế trông giống như:

       @Html.DisplayForList(Model.Organizations, "infoBtn") 
-1

Sử dụng FilterUIHint thay vì thường xuyên UIHint, trên IEnumerable<T> tài sản.

public class MyModel 
{ 
    [FilterUIHint("_CourseTableDayOfWeek")] 
    public IEnumerable<DateTime> DaysOfWeek { get; set; } 
} 

Không cần gì khác.

@Html.DisplayFor(m => m.DaysOfWeek) 

này bây giờ sẽ hiển thị một EditorTemplate "_CourseTableDayOfWeek" cho mỗi DateTime trong DaysOfWeek.

+0

Tôi không thể làm việc này. Nó chỉ bỏ qua FilterUIHint, như không có chú thích. Ngoài ra bạn sử dụng DisplayFor nhưng cho biết EditorTemplate cho mỗi; đó là một sai lầm hoặc có mục đích? – Tod

Các vấn đề liên quan