2012-10-09 25 views
12

ASP.Net 4.5 giới thiệu những cách thức mới để ràng buộc dữ liệu để kiểm soát như Repeater thông qua thuộc tính SelectMethod:Có thể chuyển giá trị cho SelectMethod của một Repeater không?

<asp:Repeater runat="server" ItemType="MyData.Reference" 
     SelectMethod="GetReferences"> 

gọi phương thức codebehind

public IEnumerable<Reference> GetReferences() 

Trong kịch bản của bộ lặp lồng nhau, là nó có thể để truyền một tham số cho phương thức select này bằng cách nào đó, để nó lấy dữ liệu khác nhau tùy thuộc vào Item của bộ lặp ngoài?

Ví dụ:

<asp:Repeater runat="server" ItemType="MyData.Reference" 
     SelectMethod="GetReferences(Item.ID)"> 

nên được gọi

public IEnumerable<Reference> GetReferences(int id) 

Tôi biết điều này có thể đạt được thông qua sự kiện ItemDataBound, nhưng tôi muốn sử dụng cú pháp đơn giản hơn nhiều và rõ ràng hơn của SelectMethod và itemtype.

Liệu phương pháp SelectMethod có cho phép tham số không?

Nếu không, có cách nào khác gọn gàng để lấy giá trị từ Mặt ngoài Repeater Item trong SelectMethod của tôi không?

+1

+1 câu hỏi hay - quan tâm. – JonH

Trả lời

8

Trong khi đợi câu trả lời, tôi đã chơi một chút và tìm giải pháp sau.

Nó có thể không phải là cách tốt nhất để làm điều đó, nhưng cho đến nay tôi đã tìm thấy không có vấn đề với nó và nó khá straigtforward, vì vậy tôi sẽ chỉ ném nó ra khỏi đó.

<asp:Repeater runat="server" ItemType="MyData.Reference" 
    DataSource='<%# GetReferences(Item.ID) %>'> 

Về cơ bản những gì tôi làm ở đây là thay thế các SelectMethod với DataSource (Intellisense sẽ không đề nghị đó, nhưng dù sao nó hoạt động).

Bằng cách này tôi có thể chuyển giá trị cho phương thức GetReferences và sau đó sử dụng giá trị trả về cho mô hình ràng buộc.

Cho đến nay, đây là giải pháp ngắn nhất mà tôi gặp phải.

2

Hãy xem hướng dẫn Exercise 1: Model Binding in ASP.NET Web Forms -> Task 3 – Value Providers in Model Binding.

Có thể xác định một số loại tham số lựa chọn điều khiển trong ký hiệu SelectMethod.

+0

Thú vị, tôi sẽ có một cái nhìn tại đó, cảm ơn. – magnattic

+0

Điều đó nghe hay nói chung, nhưng tôi không chắc mình có thể sử dụng nó cho trường hợp công việc của mình hay không. Làm thế nào tôi có thể sử dụng các nhà cung cấp giá trị để vượt qua Item ID từ bộ lặp ngoài của tôi? – magnattic

1

Bạn có thể sử dụng các nhà cung cấp giá trị gia tăng

Ví dụ:

public IQueryable<Category> GetCategories([Control]int? minProductsCount) 
{ 
} 

Đây là một danh sách các ValueProviders:

  • CompositeValueProvider. Trình bày một nhà cung cấp giá trị có giá trị đến từ một danh sách các nhà cung cấp giá trị thực hiện giao diện IEnumerable.

  • QueryStringValueProvider Đại diện cho nhà cung cấp giá trị cho chuỗi truy vấn được chứa trong đối tượng NameValueCollection.

  • RouteDataValueProvider Đại diện cho nhà cung cấp giá trị cho dữ liệu tuyến đường được chứa trong một đối tượng triển khai giao diện IDictionary(Of TKey, TValue).

  • ControlValueProvider Đại diện cho nhà cung cấp giá trị cho các giá trị kiểm soát.

  • CookieValueProvider Đại diện cho nhà cung cấp giá trị cho các giá trị cookie.

  • FormValueProvider Đại diện cho nhà cung cấp giá trị cho các giá trị biểu mẫu.

  • ProfileValueProvider Đại diện cho nhà cung cấp giá trị cho giá trị hồ sơ.

  • UserProfileValueProvider Đại diện cho nhà cung cấp giá trị cho hồ sơ người dùng.

  • ViewStateValueProvider Đại diện cho nhà cung cấp giá trị cho các giá trị trạng thái xem.

5

Đây là cách bạn làm điều đó:

Trong lặp lại bên ngoài của bạn, đặt một lĩnh vực ẩn, và đặt tên cho một SelectMethod cho repeater bên trong:

<asp:Repeater SelectMethod="GetTopLevelStuff"> 
    <ItemTemplate>  
     <asp:HiddenField runat="server" ID="ItemId" Value="<%# Item.ID %>"/> 
     <asp:Repeater SelectMethod="GetSubItems"> 
      <ItemTemplate>Template code for sub-items here</ItemTemplate 
     </asp:Repeater> 
    </ItemTemplate 
</asp:Repeater> 

Sau đó, đây là không quá nổi tài liệu-ma thuật:

public IQueryable<SubItem> GetSubItems([Control("ItemId")] int itemId) 
    { 
     return yourDataStore.GetSubItems(itemId); 
    } 

Valueprovider trong trường hợp này cũng có thể lấy tên thuộc tính, hữu ích khi sử dụng hộp danh sách để nhận "SelectedValue".

Tôi tìm thấy câu hỏi của bạn, đã làm như bạn đã làm, sau đó tôi đã thử giải pháp này thay vì hoạt động tốt, nhưng sạch hơn và nhiều hơn nữa theo ý tưởng của khái niệm, có vẻ như.

+0

Thú vị. Tôi không thích mặc dù bạn tạo ra đánh dấu đó là cơ bản vô dụng cho khách hàng hoặc postbacks tiếp theo. – magnattic

+0

Bạn có nghĩa là bản thân kiểm soát ItemID không? Nếu bạn muốn tránh đánh dấu vô ích, tôi sẽ di chuyển ra khỏi WebForms và bắt đầu xem asp.net MVC hoặc sử dụng Knockout.js - sau đó bạn thực sự có thể nắm quyền kiểm soát đánh dấu của bạn. Tôi hiểu ý anh là gì. – LavaEater

+0

@LavaEater đóng góp rất tốt, làm việc như một say mê! –