8

Nếu tôi có một ViewModel như thế này:ASP.NET MVC 3 Custom Display Template Với UIHint - Đối với vòng lặp yêu cầu?

public class MyViewModel 
{ 
    [UIHint("SomeTemplate")] 
    public ICollection<SomeViewModel> Submodel { get; set; } 
} 

Và một mạnh mẽ-gõ Xem với một dòng của HTML như thế này:

@Html.DisplayFor(model => model.Submodel) 

Và một trưng bày mẫu với một chữ ký như thế này:

@model MvcApplication1.Models.SomeViewModel 

Tôi gặp lỗi khi nói "mục mẫu là loại List<SomeViewModel> nhưng từ điển này yêu cầu kiểu máy kiểu SomeViewModel".

Điều đó có ý nghĩa, nhưng tôi đã hy vọng các họa tiết được xây dựng trong MVC sẽ khởi động, xem đó là IEnumerable của một cái gì đó và làm việc để gọi mẫu của tôi N số lần, như thường lệ đối với Html.DisplayFor không có gợi ý.

Vì vậy, có vẻ như [UIHint] ghi đè chức năng đó?

Rõ ràng tôi có thể trỏ đến một mẫu khác chấp nhận bộ sưu tập và gọi số Html.DisplayForModel(), về cơ bản mô phỏng các đồ họa MVC. Nhưng tôi hy vọng tránh điều đó. Thành thật mà nói tôi muốn làm một vòng lặp foreach hơn là có 1 dòng "wrapper" mẫu.

Bất kỳ ý tưởng nào tốt hơn?

Nó giống như tôi muốn nói: "Hey MVC, đưa ra một mẫu cho mỗi một trong những kẻ. Nhưng thay vì sử dụng quy ước tên để tìm mẫu, đây là một gợi ý".

Trả lời

7

UIHint có nghĩa là "Hiển thị mô hình này bằng mẫu có tên XXX". Vì vậy, bạn phải khai báo displaytemplate của bạn "SomeTemplate" với

@model MvcApplication1.Models.ICollection<SomeViewModel> 

Và hiển thị từng mục bên trong foreach.

+0

vì vậy không có cách nào để tận dụng MVC tích hợp tính năng thông minh khuôn mẫu (loop ngầm) trong khi vẫn sử dụng uihint? – RPM1984

+0

Không, không phải trong kiến ​​thức của tôi. Thậm chí nếu bạn muốn thực hiện nó, những gì nên được hiển thị để bao quanh tất cả các yếu tố? Trong một số trường hợp, nó phải là một bảng, trong trường hợp khác là một ul/ol. – mathieu

+0

điều là, tôi đã có một mẫu hiển thị cho 'SomeViewModel', nhưng lý do tôi đang sử dụng UIHint là vì tôi muốn ghi đè lên mẫu mặc định này bằng mẫu mới. Việc tạo khuôn mẫu mặc định cho một bộ sưu tập sẽ đơn giản chỉ hiển thị mẫu N riêng lẻ. Nó không đưa ra quyết định về ul/table. Tôi chỉ muốn vẽ ra một ** mẫu N khác nhau **. nhưng có vẻ như nó không thể được thực hiện mà không có một vòng lặp for, mà kinda sucks. Tôi luôn cố gắng tránh các vòng lặp. – RPM1984

2

Tôi đã gặp sự cố tương tự. Dường như UIHint bị bỏ qua theo mặc định cho các loại phức tạp. Bạn có thể ghi đè hành vi nhưng nó không đơn giản. Vì vậy, giải pháp đơn giản hơn sẽ là:

1) Xóa chú thích UIHint. 2) Thay vào đó hãy đảm bảo tệp mẫu hiển thị của bạn được đặt tên là tên loại bạn muốn Html.DisplayFor tự động lặp lại. Vì vậy, trong trường hợp của bạn, hãy đặt tên tệp mẫu hiển thị là SomeViewModel.cshtml. Điều này sẽ làm việc. Không cần sử dụng vòng lặp for một cách rõ ràng. Tôi đã thử nó trong MVC4 và nó hoạt động.

tôi có những giải pháp từ liên kết sau: http://roysvork.wordpress.com/2012/12/09/dynamic-repeating-field-groups-in-asp-net-mvc-with-just-a-dash-of-knockout-js/

3

Một cách khác là phải vượt qua chuỗi tên mẫu như sau

@Html.DisplayFor(model => model.Submodel, "SomeTemplate") 
+0

Yea điều này tốt đẹp để giữ cho mọi thứ gọn gàng. Có thể một ví dụ sẽ giúp mọi người bắt đầu. – ppumkin

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