2012-05-03 35 views
6

Ứng dụng là ứng dụng MVC3 có công cụ xem RAZOR.Tại sao RazorViewEngine không hiển thị DisplayTemplate của tôi?

Bộ điều khiển đang được sử dụng ở đây là TestController. Tôi đang sử dụng Chế độ xem lồng nhau.

xem cơ sở (khoản Liệt kê) đi như thế này,

//Listing.cshtml 
@model ItemsList 
@for (int i = 0; i < Model.Items.Count(); i++) 
    { 
     @Html.DisplayFor(x => x.Items[i], new { RowPosition = i}) 
} 

dưới đây là mẫu cho mục

//Item.cshtml 
@model Item 
@Html.DisplayFor(x=>x.HeaderText) 
@Html.DisplayFor(x=>x, "ItemDetails") 

Và đây là quan điểm cho món hàng Chi

//ItemDetails.cshtml 
@model Item 
@Html.DisplayFor(x=>x.Description) 

Vì vậy, , Tôi đang cố chuyển mô hình chuyển tiếp từ mẫu ITEM tới mẫu ITEMDETAILS. ItemDetails.cshtml được đặt trong "Views \ Test \ DisplayTemplates". Infact tôi đã thử đặt nó dưới thư mục "Views \ Shared" cũng như "Views \ Shared \ DisplayTemplates". Nhưng công cụ Xem có vẻ như không phải để nhặt nó lên.

Tuy nhiên tài liệu Microsoft here tuyên bố rằng công cụ xem sẽ xem trong thư mục Controller \ DisplayTemplates để tìm VIEW bằng cách sử dụng TemplateName được sử dụng.

+1

Có thể đó không phải là lỗi. Vui lòng viết tiêu đề hữu ích/có liên quan hơn. –

+2

Tom, câu hỏi của tôi là tại sao công cụ xem không chọn Chế độ xem. Màn hình hiển thị cho ItemDetails chỉ hiển thị trống. Không có ngoại lệ. Làm thế nào tôi có thể gỡ lỗi như thế nào xem động cơ đang làm việc đằng sau hậu trường? – EagerToLearn

+1

không bao giờ đánh giá thấp sức mạnh của một giấc ngủ ngắn –

Trả lời

5

Điều này dường như là hành vi dành cho hiển thị/EditorTemplates, có lẽ để tránh đệ quy vô hạn bất đắc dĩ ở màn hình mẫu tùy chỉnh, chẳng hạn như làm (trong Item.cshtml):

@model Item 
@Html.DisplayFor(x => x) 

. ..những gì sẽ vô hạn hiển thị Item.cshtml DisplayTemplate.

Rõ ràng trong ví dụ của bạn, bạn đang chuyển mục/mô hình đến một mẫu khác nhau, vì vậy nó sẽ không gây ra đệ quy vô hạn. Tuy nhiên, nó vẫn có vẻ bị bắt bởi cùng một bảo vệ an toàn trong khuôn khổ. Không thực sự chắc chắn nếu nó sẽ được phân loại như là một 'lỗi' hoặc chỉ 'bằng cách thiết kế'?

Đây là dấu check ở mục DisplayFor/TemplateFor helper:

// Normally this shouldn't happen, unless someone writes their own custom Object templates which 
// don't check to make sure that the object hasn't already been displayed 
object visitedObjectsKey = metadata.Model ?? metadata.RealModelType; 
if (html.ViewDataContainer.ViewData.TemplateInfo.VisitedObjects.Contains(visitedObjectsKey)) { // DDB #224750 
    return String.Empty; 
} 

ViewData.TemplateInfo.VisitedObjects lưu trữ các đối tượng đã đến thăm/mô hình cho các mẫu mẹ. Khi bạn chạy:

@Html.DisplayFor(x => x.Items[i], new { RowPosition = i}) 

Nó render Item.cshtml DisplayTemplate của bạn và thêm mục/mô hình để VisitedObjects.Điều này có nghĩa khi Item.cshtml cố gắng để hiển thị một mẫu con với cùng một mục/mô hình:

@Html.DisplayFor(x => x, "ItemDetails") 

Mục/mô hình là đã có trong VisitedObjects, vì vậy nếu tuyên bố trên trả về true và thay vì render ItemDetails.cshtml nó chỉ âm thầm trả/hiển thị chuỗi trống.

+0

Tôi đã gặp phải "tính năng" này gần đây và nó đã khiến tôi không bị kết thúc. Tôi nghĩ rằng đội MVC đã phạm sai lầm ở đây. Trả về một chuỗi rỗng cho nhà phát triển ấn tượng rằng mọi thứ đều ổn, cho đến khi họ thấy đầu ra. Nó cũng làm cho nó tiếp theo để không thể tìm ra những gì _IS_ xảy ra. Ít nhất mã có thể ném một ngoại lệ, cung cấp giải thích cho hành vi và cảnh báo cho nhà phát triển về vấn đề này. –

1

Trước tiên, không sử dụng vòng lặp for. Display/EditorTemplates có khả năng xử lý các bộ sưu tập.

Thứ hai, ItemsList là gì? Và nó được xác định như thế nào? Nếu nó chỉ đặt tên cho một loại thu thập cụ thể, thì đừng làm vậy. Chỉ cần có một danh sách hoặc một cái gì đó thay vào đó (trừ khi bạn cần xử lý vật phẩm đặc biệt, trong trường hợp này thực hiện IEnumerable trên lớp bộ sưu tập của bạn). Sau đó, bạn sẽ có một ItemsList.cshtml hoặc chỉ đơn giản là một Item.cshtml nếu bạn chuyển đổi sang sử dụng một danh sách

Ngoài ra, DisplayFor() của bạn trong chế độ xem chính là sai. bạn không thể chuyển các thuộc tính html vào DisplayTemplates theo cách đó.

0

hãy thử sử dụng @Html.RenderPartial("ItemDetails", item)

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