2008-11-10 27 views
11

Tôi đã chơi xung quanh với ASP.NET MVC và đã có một câu hỏi. Hoặc có thể đó là một mối lo ngại rằng tôi đang làm điều này sai. Chỉ cần làm việc trên một trang web lame để kéo dài đôi cánh của tôi một chút. Tôi xin lỗi câu hỏi này không phải là tất cả súc tích.ASP.Net MVC và RenderPartial w/đường dẫn tương đối

Ok, đây là kịch bản. Khi người dùng truy cập trang chủ/chỉ mục, trang sẽ hiển thị danh sách các sản phẩm và danh sách các bài viết. Cách bố trí tập tin là như vậy (DAL là lớp truy cập dữ liệu của tôi): Tuy nhiên

 
Controllers 
    Home 
     Index  

Views 
    Home 
     Index  inherits from ViewPage 
    Product   
     List  inherits from ViewUserControl<IEnumerable<DAL.Product>> 
     Single  inherits from ViewUserControl<DAL.Product> 
    Article 
     List  inherits from ViewUserControl<IEnumerable<DAL.Article>> 
     Single  inherits from ViewUserControl<DAL.Article> 
Controllers.HomeController.Index produces a View whose ViewData contains two entries, a IEnumerable<DAL.Product> and a IEnumerable<DAL.Article>. 

View.Home.Index will use those view entries to call: 
Html.RenderPartial("~/Views/Product/List.ascx", ViewData["ProductList"]) 
and Html.RenderPartial("~/Views/Article/List.ascx", ViewData["ArticleList"]) 

View.Product.List will call 
foreach(Product product in View.Model) 
    Html.RenderPartial("Single", product); 

View.Article.List does something similar to View.Product.List 

Cách tiếp cận này thất bại. Cách tiếp cận này có ý nghĩa với tôi, nhưng có lẽ ai đó có nhiều kinh nghiệm hơn với các nền tảng MVC này sẽ nhận ra một cách tốt hơn.

Ở trên tạo lỗi trong View.Product.List. Cuộc gọi đến Html.RenderPartial("Single",...) khiếu nại rằng chế độ xem "Đơn" không được tìm thấy. Lỗi cho biết:

 
The partial view 'Single' could not be found. The following locations were searched: 
~/Views/Home/Single.aspx 
~/Views/Home/Single.ascx 
~/Views/Shared/Single.aspx 
~/Views/Shared/Single.ascx 

Vì tôi đã gọi hàm RenderAction() từ chế độ xem trong Sản phẩm, tôi dự kiến ​​thời gian chạy để tìm chế độ xem "Đơn" trong Chế độ xem \ Sản phẩm. Có vẻ như tuy nhiên việc tra cứu là tương đối với bộ điều khiển gọi ra khung nhìn gốc (/ Controller/Home được gọi/Views/Product) chứ không phải là khung nhìn hiện tại.

Vì vậy, tôi có thể sửa lỗi này bằng cách thay đổi Views \ sản phẩm, chẳng hạn rằng:

View.Product.List will call 
foreach(Product product in View.Model) 
    Html.RenderPartial("~/Views/Product/Single.ascx", product);

thay vì

View.Product.List will call 
foreach(Product product in View.Model) 
    Html.RenderPartial("Single", product); 

sửa chữa công trình này nhưng .. Tôi không hiểu tại sao tôi cần phải chỉ định đường dẫn đầy đủ của chế độ xem. Nó sẽ có ý nghĩa với tôi cho tên tương đối được giải thích tương đối so với đường dẫn của khung nhìn hiện tại chứ không phải đường dẫn xem của trình điều khiển gốc. Tôi không thể nghĩ ra bất kỳ trường hợp hữu ích nào khi diễn giải tên liên quan đến giao diện của bộ điều khiển thay vì chế độ xem hiện tại là hữu ích (ngoại trừ trường hợp điển hình là chúng giống nhau).

Khoảng thời gian này, tôi nên có dấu chấm hỏi? Để nhấn mạnh điều này thực sự là một câu hỏi.

+0

Chỉ cần stumbled trên này tìm kiếm cái gì liên quan (Tôi nhận ra nó trên 6 tháng tuổi). Nhưng bạn đề cập đến sử dụng RenderAction(), tuy nhiên tất cả các ví dụ của bạn sử dụng RenderPartial(), đây có phải là lỗi đánh máy không? Tôi sẽ giả định rằng RenderAction (như trái ngược với RenderPartial) nên làm việc trong tình huống này? –

Trả lời

4

[sửa:

Tôi đã suy nghĩ, bạn có 2 trường hợp:

  • bộ điều khiển Trang chủ là người duy nhất từng tham chiếu kiểm soát sản phẩm/Danh sách bài viết sử dụng
  • người dùng điều khiển được chia sẻ bởi một số bộ điều khiển

Trong trường hợp đầu tiên, chế độ xem của người dùng thực sự thuộc về bộ điều khiển nhà và có ý nghĩa khi đặt chúng trong nhà thư mục oller. Trong trường hợp thứ hai, nó có ý nghĩa để đặt chúng trong thư mục chia sẻ vì chúng sẽ được chia sẻ bởi bộ điều khiển.

Trong cả hai trường hợp, có thể bạn có thể đặt chúng trong thư mục con. Giống như Chế độ xem/Trang chủ/Sản phẩm và sau đó thử RendarPartial ("Sản phẩm/Độc thân") và xem điều gì sẽ xảy ra? Tôi không biết nếu nó sẽ cố gắng giải quyết nó để: Trang chủ/Sản phẩm/Single và sau đó chia sẻ/sản phẩm/đơn hay không. Nếu các thư mục con hoạt động, có vẻ như cho phép phân tách hợp lý Sản phẩm và Điều, trong khi cho thấy rằng chúng vẫn là thành viên của bộ điều khiển Trang chủ hoặc Được chia sẻ bởi tất cả các bộ điều khiển.

]

Kiểm tra xem bài viết trong blog này bởi Steve Sanderson:

http://blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc/

Những gì bạn đang làm là không sai, nhưng nó dường như để loại đi ngược lại các quy ước của Xem/Tên thư mục bộ điều khiển. Điều đó nói rằng, nó có ý nghĩa để muốn xác định điều khiển người dùng điều khiển xem thuyết bất khả tri và làm tổ họ có vẻ hợp lệ. Vì vậy, tôi không biết!

Dù sao, liên kết chỉ mô tả phương pháp thay vì sử dụng RenderPartial để hiển thị điều khiển sử dụng, nó xác định phương thức RenderPartialRequest để trả về giá trị trả về (trong trường hợp người dùng điều khiển) của một hành động điều khiển. Vì vậy, bạn có thể thêm một bộ điều khiển sản phẩm và bài viết với một danh sách hành động trả về điều khiển người dùng của bạn, và sau đó gọi hai hành động đó từ khung nhìn Home/Index. Điều này có vẻ trực quan hơn với tôi, nhưng chỉ là một ý kiến.

Ông cũng đề cập đến các nhà quản lý phụ từ MVC Contrib, và tôi khá chắc chắn có mong muốn cho một cái gì đó như thế này là một phần của phát hành ASP.NET MVC.

+0

RenderPartial ("Sản phẩm/Độc thân") sẽ hoạt động đối với thư mục con trong thư mục Chế độ xem sản phẩm. Tôi đã sử dụng kỹ thuật này cho một số khung nhìn từng phần mà tôi muốn giữ trong một thư mục con từ phần còn lại của ASPX/ASCX được kết hợp với bộ điều khiển. – RichardOD

5

Bởi vì tôi đã gọi RenderAction() từ một cái nhìn trong Sản phẩm

...

Tôi không hiểu tại sao tôi cần để xác định đường dẫn đầy đủ về quan điểm. Nó sẽ làm cho tinh thần để tôi cho tên tương để được giải thích so với giao diện hiện tại của con đường hơn xem con đường

Phần tôi nghĩ rằng bạn đang hiểu lầm là "thi vị trí bộ điều khiển gốc "vì thiếu một thuật ngữ tốt hơn hoặc chính thức. Đường dẫn không liên quan đến chế độ xem của bạn, thậm chí không phải là "chế độ xem của trình điều khiển" khi bạn đặt nó. Chúng liên quan đến URL yêu cầu của bạn, nó xác định ngữ cảnh của trình điều khiển. Tôi có thể không nói nó rất tốt, nhưng nếu bạn dành một chút thời gian trong Reflector nhìn vào cách URL và các tuyến đường được giải quyết, tôi nghĩ rằng điều này tất cả sẽ rơi vào vị trí trong đầu của bạn.

+0

Điều bạn nói có ý nghĩa. –

+0

Các hành vi có ý nghĩa, nhưng nó không có ý nghĩa với tôi tại sao đó sẽ là thiết kế mặc dù. Tôi không nghĩ rằng các mã trong quan điểm cần phải được nhận thức của con đường nó được gọi là từ. –

2

Từ nhìn vào mẫu MVCStoreFront đây là làm thế nào họ có tất cả mọi thứ có cấu trúc để gọi renderPartial

Views 
    Shared 
     ProductSingle 
     ProductList 
     ArticleSingle 
     ArticleList 

Sau đó, làm cho họ thông qua:

<% Html.RenderPartial("ProductSingle", ViewData["ProductList"]); %> 
<% Html.RenderPartial("ProductList", product); %> 
<% Html.RenderPartial("ArticleSingle", article); %> 
<% Html.RenderPartial("ArticleList", ViewData["ArticleList"]); %> 
Các vấn đề liên quan