Vượt qua ViewData bổ sung để xem một phần được đánh máy mạnh


174

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

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

Câu trả lời:


251

RenderPartial lấy một tham số khác đơn giản là ViewDataDipedia. Bạn đang ở gần đó, chỉ cần gọi nó như thế này:

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

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


2
Tôi đang cố gắng làm điều này và nó đang trả về "không thể chuyển đổi void thành đối tượng".
chương trình

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

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

162

Để mở rộng những gì đã được đăng, bạn có thể chuyển Dữ liệu xem mới trong khi vẫn giữ lại Dữ liệu xem hiện có nếu bạn sử dụng quá tải hàm tạo ViewDataDictionarynhư sau:

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.HtmlFieldPrefixtrong điều khiển con sẽ được đặt lại theo cách khác
Simon_Weaver

12
Đâ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. +1
Kevin Farrugia

Điều này dường như chỉ hoạt động nếu bạn không vượt qua TemplateInfo.HtmlFieldPrefix trong ViewDataDipedia của bạn. Tôi chỉ có thể chuyển một biến là không phù hợp với câu trả lời hoặc vượt qua một TemplateInfo.HtmlFieldPrefix nhưng không thể cả hai.
Ferox

45
@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" } });}

Trang một phần (_Head):

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

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

9

Tôi nghĩ rằng điều này nên làm việc không?

ViewData["currentIndex"] = index;

6
Mặc dù đây không phải là một cách mạnh mẽ để làm điều đó, nhưng nó đã giúp tôi tìm ra cách lấy lại giá trị dữ liệu xem từ câu trả lời của Womp.
Mathias Lykkegaard Lorenzen

6

Tạo một lớp khác có chứa lớp gõ mạnh của bạn.

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

Sau đó, trong chế độ xem, đảm bảo bạn kế thừa lớp mới của mình và thay đổi các bit mã hiện sẽ bị lỗi. cụ thể là các tài liệu tham khảo đến các lĩnh vực của bạn.

Hi vọng điêu nay co ich. 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 để truyền dữ liệu bổ sung là thêm dữ liệu vào ViewData hiện có để xem dưới dạng ghi chú @Joel Martinez. Tuy nhiên, nếu bạn không muốn làm ô 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ố mà bạn hiển thị. Đối số thứ ba là ViewDataDipedia. Bạn có thể xây dựng một ViewDataDipedia riêng 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.


1

Điều này cũng nên làm việc.

this.ViewData.Add("index", index);

Html.RenderPartial(
      "ProductImageForm", 
       image, 
       this.ViewData
); 

Cảm ơn! Điều này thực sự hữu ích khi bạn đang mở rộng từ điển ViewData cho partials con vv
developius

1

Tôi biết đây là một bài viết cũ nhưng tôi đã gặp nó khi gặp vấn đề tương tự khi sử dụng core 3.0, hy vọng nó sẽ giúp được ai đó.

@{
Layout = null;
ViewData["SampleString"] = "some string need in the partial";
}

<partial name="_Partial" for="PartialViewModel" view-data="ViewData" />

0

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

ViewBag.AnotherValue = valueToView;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.