2013-05-10 22 views
33
@model Customer 

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile) 

Khi tôi chạy mã này, tôi nhận được lỗi này:(PartialView) Mô hình mục đã qua vào từ điển là loại 'khách hàng', nhưng từ điển này đòi hỏi phải có một mục mô hình của loại 'UserProfile'

The model item passed into the dictionary is of type 'Customer', but this dictionary requires a model item of type 'UserProfile'. 

Xem một phần _UserProfile được nhập mạnh mẽ.

Tôi muốn có thể chỉnh sửa trường này. Bất kỳ đề xuất nào?

+0

cũng kiểm tra sự khác biệt giữa Html.Action và Html.Partial là hữu ích https://stackoverflow.com/questions/16886585/html-partial-skips-the-controller-action –

Trả lời

72

Đảm bảo Model.UserProfile của bạn không rỗng.

Tôi đã tìm thấy bài đăng của bạn đang cố gắng gỡ lỗi tương tự và hóa ra tôi đã không khởi tạo "Model.UserProfile" tương đương.

Tôi đoán điều gì đang xảy ra ở đây, đó là nếu một mô hình null được chuyển đến RenderPartial, nó mặc định để sử dụng mô hình của khung nhìn chính? bất cứ ai có thể xác nhận điều này?

+18

Bạn nói đúng. Đây là một vấn đề quá tải. Khi bạn cố gắng gọi '@ Html.Partial (, )' trong khi chuyển Mô hình thành 'null', việc triển khai sẽ giả sử bạn đã gọi phiên bản phương thức chỉ chấp nhận tên của chế độ xem và chuyển mô hình xem hiện tại tới xem một phần. – Lafi

+0

Có, bạn chính xác! Bạn có thể thêm PropertyThatWasNull = new YourObject() vào trong ViewModel Constructor của bạn để sửa lỗi này trong hầu hết các trường hợp. Có thể khó khăn hơn với một đối tượng UserProfile null. – jwize

+1

Lỗi khó chịu trên MVC, chỉ bị ảnh hưởng bởi nó, nhờ mẹo. – Alejandro

-1

Bạn đang cố gắng phân biệt đối tượng loại Customer cho đối tượng loại UserProfile. Theo mặc định, điều này sẽ không hoạt động vì khung làm việc không có ý tưởng làm thế nào để đúc các đối tượng này. Nếu bạn hoàn toàn phải làm theo cách này, tùy chọn duy nhất là cung cấp toán tử dàn diễn viên rõ ràng như:

public static explicit operator Digit(byte b) // explicit byte to digit conversion operator 
{ 
    Digit d = new Digit(b); // explicit conversion 

    System.Console.WriteLine("Conversion occurred."); 
    return d; 
} 

Bạn có thể đọc thêm về nó here.

+0

Có một diễn viên cho thuộc tính UserProfile. Trong trường hợp này tôi nghĩ rằng nó không cần thiết nhưng có vẻ như một nỗ lực rõ ràng để nói với trình biên dịch đây là loại tôi đang chuyển. – avantprime

-1

Thêm từ khóa "ảo" vào thuộc tính UserProfile trên mô hình Khách hàng. Đây là cách dễ nhất để khắc phục tình trạng tải chậm, nhưng hiệu suất ..

18

Nếu Model.UserProfile là null, nó sẽ cố gắng chuyển vào mô hình khách hàng của bạn.

Hai cách để làm được việc này:

@model Customer 

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile, new ViewDataDictionary()) 

Hoặc:

@model Customer 

if (Model.UserProfile != null) 
{ 
    @Html.Partial("_UserProfile", (UserProfile)Model.UserProfile) 
} 
+0

Thứ hai sẽ không hoạt động, bạn cần phải sử dụng một dàn diễn viên phòng thủ: '@ Html.Partial (" _ UserProfile ", Model là UserProfile)' – Echilon

+0

@Echilon: Bạn là người thứ hai không làm việc, nhưng cũng không đề xuất của bạn. Tùy chọn đầu tiên trong câu trả lời không giải quyết được vấn đề. – musefan

+0

Thứ hai được thiết kế để bỏ qua một phần nếu mô hình là null. Trong ví dụ này, có thể không hữu ích khi hiển thị chế độ xem UserProfile khi không có hồ sơ người dùng và điều này sẽ tránh được lỗi. – Kcoder

0

Nó sẽ dự phòng trên mô hình ban đầu nếu mục đã qua là null.

Hãy thử điều này:

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile ?? new UserProfile()) 
1

Tôi chạy vào vấn đề này khi giao dịch với các bộ phận của hồ sơ người dùng như tên và ghi địa chỉ. Nếu người dùng có cấu hình không đầy đủ, tôi muốn chế độ xem quản lý tài khoản phát hiện một bản ghi Địa chỉ rỗng và hiển thị liên kết Hành động để tạo Địa chỉ mới hoặc hiển thị bất kỳ dữ liệu địa chỉ nào có sẵn.

Như được mô tả bởi những người khác khi giá trị rỗng vượt quá quá tải cho Html.RenderPartial được kích hoạt và Mô hình chế độ xem gốc được chuyển qua. Tôi đã kết thúc chuyển đổi các khung nhìn từng phần của mình sang Hiển thị và các mẫu biên tập để có được nó.Dưới đây là một số Làm thế nào-To bài viết từ: Hanslemancodeguru

Bạn nhận được tốt hơn lại khả năng sử dụng từ phương pháp này và nó giữ gìn các giá trị null: Trong Xem bạn:

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

Sau đó xử lý các giá trị null trong DisplayTemplate.

@model Namespace.Models.MyObject 
... 
if(@Model != null){ 
... 
}else{ 
... 
} 
+1

Trong tất cả các phương pháp chúng tôi đã cố gắng giải quyết vấn đề của riêng mình về vấn đề này, điều này là tốt nhất. ViewData và ModelState (bao gồm cả lỗi ModelState, v.v.) đều được truyền bình thường với điều này. Hầu hết các giải pháp khác vượt qua một đối tượng ViewData mới mà vít lên bất kỳ ModelState nào. – mikeschuld

+0

Chính xác @mikeschuld Tại sao bạn muốn xử lý lỗi và xử lý một đối tượng mới khi thực tế mô hình của bạn là null? Chỉ cần xử lý trạng thái cần xử lý. Trong sự công bằng tôi đã không trả lời câu hỏi đó là làm thế nào để sử dụng Html.Partial tôi chỉ nói không sử dụng nó nếu đối tượng của bạn có thể là null. – reachingnexus

0

Tôi đã gặp phải vấn đề tương tự nhưng cuối cùng tôi đã tìm ra. Có loại không phù hợp trong các mẫu được truyền .. Chế độ xem của bạn chấp nhận kiểu Customer nhưng bạn xem một phần là chuyển mô hình Userprofile vì vậy những gì bạn phải làm là chuyển cùng một mô hình vào cả hai hoặc .... tạo mô hình có tất cả các thuộc tính của cả hai mô hình. Chắc chắn vấn đề của bạn sẽ được giải quyết.

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