Я играл с 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",...)
жалуется на то, что «Единый» просмотр не найден. Ошибка указывает:
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, я ожидал, что среда выполнения будет искать «одиночное» представление в Views \ Product. Однако, похоже, что поиск относится к контроллеру, который вызвал исходное представление (/ Controller / Home invoked / Views / Product), а не к текущему представлению.
Так что я могу это исправить, изменив Views \ Product, например:
View.Product.List will call
foreach(Product product in View.Model)
Html.RenderPartial(<b>"~/Views/Product/Single.ascx"</b>, product);
вместо
View.Product.List will call
foreach(Product product in View.Model)
Html.RenderPartial(<b>"Single"</b>, product);
Это исправление работает, но .. Я не понимаю, почему мне нужно было указать полный путь к представлению. Для меня имеет смысл интерпретировать относительное имя относительно пути текущего представления, а не пути представления исходного контроллера. Я не могу вспомнить ни одного полезного случая, когда полезно интерпретировать имя относительно представления контроллера вместо текущего представления (за исключением типичного случая, когда они совпадают).
Примерно в это же время у меня должен быть знак вопроса? Чтобы подчеркнуть это на самом деле вопрос.