2011-08-24 22 views
36

Có cách nào để chuyển một phần dữ liệu bổ sung cùng với một mô hình đến một góc nhìn một phần không?MVC3 - Truyền dữ liệu vượt ra ngoài mô hình để xem một phần

E.G.

@Html.Partial("_SomeTable", (List<CustomTable>)ViewBag.Table);

Là những gì tôi hiện có. Tôi có thể thêm cái gì khác mà không thay đổi Mô hình của mình không?

@Html.Partial("_SomeTable", (List<CustomTable>)ViewBag.Table, "TemporaryTable");

tôi thấy ViewDataDictionary như một param. Tôi không chắc chắn những gì đối tượng này làm hoặc nếu điều này đáp ứng nhu cầu của tôi.

Trả lời

64

ViewDataDictionary có thể được sử dụng để thay thế từ điển ViewData trong chế độ xem một phần ... Nếu bạn không vượt qua tham số ViewDataDictionary thì chế độ xem của parial giống như cha mẹ.

Một ví dụ về làm thế nào để sử dụng nó trong các phụ huynh là:

@Html.Partial("_SomeTable", (List<CustomTable>)ViewBag.Table, new ViewDataDictionary {{ "Key", obj }}); 

Sau đó, trong phần bạn có thể truy cập này obj như sau:

@{ var obj = ViewData["key"]; } 

Một cách tiếp cận hoàn toàn khác nhau woud được sử dụng lớp Tuple để nhóm cả mô hình ban đầu và dữ liệu bổ sung với nhau như sau:

@Html.Partial("_SomeTable", Tuple.Create<List<CustomTable>, string>((List<CustomTable>)ViewBag.Table, "Extra data")); 

Các loại mô hình cho từng phần sau đó sẽ là:

@model Tuple<List<CustomTable>, string> 

Model.Item1 cung cấp cho các đối tượng Danh sách và Model.Item2 cho chuỗi

+2

Tôi không thể hiểu được cú pháp trong 'mới ViewDataDictionary {{ "Key", obj}} '. Đâu là dấu ngoặc đơn() trong 'mới ViewDataDictionary()' – Mahmoodvcs

+2

Chúng thừa khi bạn có bộ khởi tạo đối tượng .. đó là mã trực tiếp sau ViewDataDictionary mới .. xem http://msdn.microsoft.com/en -us/library/bb531208.aspx –

+1

'@ {var obj = ViewBag.Key; } 'cũng hoạt động để truy cập dữ liệu đã truyền – MEC

7

Bạn sẽ có thể chỉ cần đặt nó trong ViewBag và sau đó truy cập nó từ ViewBag trong chế độ xem một phần. See this SO answer.

2

Bạn có thể nhận được thậm chí thông minh as shown here by Craig Stuntz

Html.RenderPartial("SomePartialView", null, 
    new ViewDataDictionary(new ViewDataDictionary() { {"SomeDisplayParameter", true }}) 
     { Model = MyModelObject }); 
5

tôi cũng gặp vấn đề này. Tôi muốn có một đoạn mã được sao chép nhiều lần, và không muốn sao chép dán. Mã sẽ thay đổi đôi chút. Sau khi nhìn vào các câu trả lời khác, tôi không muốn đi con đường chính xác đó và quyết định thay vì chỉ sử dụng một số Dictionary đơn giản.

Ví dụ:

parent.cshtml

@{ 
var args = new Dictionary<string,string>(); 
args["redirectController"] = "Admin"; 
args["redirectAction"] = "User"; 
} 
@Html.Partial("_childPartial",args) 

_childPartial.cshtml

@model Dictionary<string,string> 
<div>@Model["redirectController"]</div> 
<div>@Model["redirectAction"]</div> 
Các vấn đề liên quan