2009-07-23 29 views
144

Tôi có Chế độ xem một phần mạnh mẽ lấy Hình ảnh sản phẩm và khi được hiển thị, tôi cũng muốn cung cấp thêm một số ViewData bổ sung mà tôi tạo động trong trang chứa. Làm thế nào tôi có thể vượt qua cả hai đối tượng mạnh mẽ của tôi gõ và ViewData tùy chỉnh của tôi để xem một phần với các cuộc gọi RenderPartial?Vượt qua Chế độ xem bổ sung cho Chế độ xem một phần được đánh máy mạnh

var index = 0; 
foreach (var image in Model.Images.OrderBy(p => p.Order)) 
{ 
    Html.RenderPartial("ProductImageForm", image); // < Pass 'index' to partial 
    index++; 
} 

Trả lời

208

RenderPartial lấy một tham số khác chỉ đơn giản là một ViewDataDictionary. Bạn sắp hoàn tất, chỉ cần gọi nó như sau:

Html.RenderPartial(
     "ProductImageForm", 
     image, 
     new ViewDataDictionary { { "index", index } } 
); 

Lưu ý rằng điều này sẽ ghi đè chế độ xem mặc định mà tất cả các chế độ xem khác của bạn mặc định. Nếu bạn đang thêm bất cứ thứ gì vào ViewData, nó sẽ không có trong từ điển mới này mà bạn đang chuyển đến phần xem của bạn.

+1

Tôi đang cố gắng thực hiện điều này và nó đang trả về "không thể chuyển đổi khoảng trống thành đối tượng". – programad

+3

@programad Hãy thử xóa @ khỏi @ Html.RenderPartial(), điều này đã khắc phục vấn đề đó cho tôi, nhưng tôi đã gọi hàm RenderPartial() trên một dòng trong khối mã @ {}. – danjarvis

+4

Tôi khuyên bạn nên kiểm tra câu trả lời của ctorx dưới đây. Anh ấy thêm dữ liệu bổ sung vào ViewData hiện có. – raRaRa

8

Tôi nghĩ điều này sẽ hoạt động không?

ViewData["currentIndex"] = index; 
+5

Mặc dù đây không phải là cách thực hiện mạnh mẽ, nó giúp tôi tìm ra cách lấy giá trị dữ liệu xem từ câu trả lời của Womp. –

5

Tạo một lớp khác có lớp học được đánh máy mạnh mẽ của bạn.

Thêm nội dung mới của bạn vào lớp học và trả lại trong chế độ xem.

Sau đó, trong chế độ xem, hãy đảm bảo bạn kế thừa lớp mới của mình và thay đổi các bit mã sẽ bị lỗi. cụ thể là các tham chiếu đến các trường của bạn.

Hy vọng điều này sẽ hữu ích. Nếu không thì hãy cho tôi biết và tôi sẽ đăng mã cụ thể.

4

Cách dễ nhất để chuyển dữ liệu bổ sung là thêm dữ liệu vào Chế độ xem hiện tại cho chế độ xem như @Joel Martinez lưu ý. Tuy nhiên, nếu bạn không muốn gây ô nhiễm ViewData của mình, RenderPartial có một phương thức lấy ba đối số cũng như phiên bản hai đối số bạn hiển thị. Đối số thứ ba là một ViewDataDictionary. Bạn có thể xây dựng một ViewDataDictionary riêng biệt chỉ cho một phần của bạn chỉ chứa dữ liệu bổ sung mà bạn muốn truyền vào.

130

Để mở rộng về những gì womp đăng, bạn thể vượt qua mới Xem dữ liệu trong khi giữ lại Xem dữ liệu hiện tại nếu bạn sử dụng quá tải constructor của ViewDataDictionary như vậy:

Html.RenderPartial(
     "ProductImageForm", 
     image, 
     new ViewDataDictionary(this.ViewData) { { "index", index } } 
); 
+3

điều này có thể rất hữu ích nếu bạn cần giữ lại 'TemplateInfo.HtmlFieldPrefix' trong điều khiển con sẽ được đặt lại khác –

+8

Đây chắc chắn là giải pháp tốt hơn. Mất ViewData có nghĩa là bạn mất ModelState và tất cả các xác nhận hợp lệ. +1 –

+0

Điều này dường như chỉ hoạt động nếu bạn không chuyển Thông tin mẫu.HtmlFieldPrefix trong ViewDataDictionary của bạn. Tôi chỉ có thể vượt qua một biến như ilustrated trên câu trả lời, hoặc vượt qua một TemplateInfo.HtmlFieldPrefix nhưng không phải cả hai. – Ferox

32
@Html.Partial("_Header", new ViewDataDictionary { { "HeaderName", "User Management" }, { "TitleName", "List Of Users" } }) 
or 
@{Html.RenderPartial("_Header", new ViewDataDictionary { { "HeaderName", "User Management" }, { "TitleName", "List Of Users" } });} 

phần trang (_Header):

<div class="row titleBlock"> 
    <h1>@ViewData["HeaderName"].ToString()</h1> 
    <h5>@ViewData["TitleName"].ToString()</h5> 
</div> 
+2

Điều này có vẻ như câu trả lời hoàn chỉnh nhất (mặc dù .ToString() là không cần thiết). – Colin

0

Bạn có thể sử dụng biến động ViewBag

ViewBag.AnotherValue = valueToView; 
Các vấn đề liên quan