Я играю с ASP.NET MVC и задал вопрос. Или, может быть, это беспокойство, что я делаю это неправильно. Просто работаю над хромым сайтом, чтобы немного растянуть мои крылья. Мне жаль, что этот вопрос не совсем лаконичен.
Хорошо, вот сценарий. Когда пользователь посещает дом/индекс, страница должна показывать список продуктов и список статей. Макет файла такой (DAL - мой уровень доступа к данным):
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
Однако этот подход не работает. Подход имеет смысл для меня, но, возможно, кто-то с большим опытом работы с этими платформами MVC распознает лучший способ.
Вышеизложенное вызывает ошибку внутри View.Product.List. Призыв к Html.RenderPartial("Single",...)
жалуется, что вид "Single" не найден. Ошибка указывает:
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
Поскольку я вызывал RenderAction() из представления в Product, я ожидал, что среда выполнения будет искать представление "Single" в Views\Product. Кажется, что поиск относится к контроллеру, который вызывал исходный вид (/Controller/Home invoked/Views/Product), а не текущий вид.
Поэтому я могу исправить это, изменив Views\Product, чтобы:
View.Product.List will call
foreach(Product product in View.Model)
Html.RenderPartial("~/Views/Product/Single.ascx", product);
вместо
View.Product.List will call
foreach(Product product in View.Model)
Html.RenderPartial("Single", product);
Это исправление работает, но.. Я не понимаю, почему мне нужно было указать полный путь к представлению. Для меня было бы разумно, чтобы относительное имя было интерпретировано относительно текущего пути просмотра, а не исходного пути представления контроллера. Я не могу придумать какой-либо полезный случай, когда полезно использовать интерпретацию имени относительно представления контроллера вместо текущего представления (за исключением типичного случая, когда они одинаковы).
Примерно в это же время у меня должен быть знак вопроса? Для акцента это на самом деле вопрос.