Gram w ASP.NET MVC i miałem pytanie. A może jest to troska, że robię to źle. Po prostu pracuję nad kiepską stroną, żeby trochę rozciągnąć skrzydła. Przykro mi, że to pytanie wcale nie jest zwięzłe.ASP.Net MVC i RenderPartial w ścieżkach względnych
OK, oto scenariusz. Gdy użytkownik odwiedza stronę główną/indeks, strona powinna wyświetlić listę produktów i listę artykułów. Układ jest taki plik (DAL jest mój warstwa dostępu do danych):
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
Podejście to jednak nie powiedzie. Podejście ma dla mnie sens, ale może ktoś, kto ma większe doświadczenie z platformami MVC, rozpozna lepszy sposób.
Powyższe powoduje błąd w pliku View.Product.List. Połączenie z numerem Html.RenderPartial("Single",...)
skarży się, że nie znaleziono "pojedynczego" widoku. Błąd pojawia się:
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
Bo dzwoni RenderAction() ze względu na produkt, spodziewałem runtime szukać „single” widzenia w Wyświetleń \ Produktu. Wygląda jednak na to, że wyszukiwanie jest względne dla kontrolera, który wywołał pierwotny widok (/ Controller/Home invoked/Views/Product) zamiast bieżącego widoku.
Więc jestem w stanie rozwiązać ten problem przez widoków zmieniającym \ Produktu, takie, że:
View.Product.List will call
foreach(Product product in View.Model)
Html.RenderPartial("~/Views/Product/Single.ascx", product);
zamiast
View.Product.List will call
foreach(Product product in View.Model)
Html.RenderPartial("Single", product);
Ta poprawka działa .. ale nie rozumiem dlaczego ja potrzebowałem podaj pełną ścieżkę widoku. Dla mnie sensowne byłoby interpretowanie względnej nazwy względem ścieżki bieżącego widoku, a nie ścieżki widoku oryginalnego kontrolera. Nie mogę wymyślić żadnego przydatnego przypadku, w którym interpretacja nazwy względem widoku kontrolera zamiast bieżącego widoku jest przydatna (z wyjątkiem typowego przypadku, gdy są one takie same).
Mniej więcej w tym czasie powinienem mieć znak zapytania? Podkreślenie tego jest właściwie pytaniem.
Właśnie natknął to szuka czegoś związanego (zdaję sobie sprawę, jego powyżej 6 miesięcy). Ale wspomniałeś o użyciu RenderAction(), jednak wszystkie twoje przykłady używają RenderPartial(), czy to literówka? Zakładam, że RenderAction (w przeciwieństwie do RenderPartial) powinien działać w tej sytuacji? –