Создать ссылку на SurfaceController в Umbraco

Поскольку я новичок в Umbraco, я не совсем понял механизмы маршрутизации, которые он, кажется, имеет.

У меня есть пользовательский контроллер поверхности myProject.Controllers.CompanySurfaceController с getCompanyList() а также getCompany(int companyId) функция.

Основная идея состоит в том, чтобы получить список компаний из БД, сделать частичное представление с классическим <a> ссылки на getCompany(..)функция и извлекать / отображать эту компанию из БД.

Все работает хорошо, кроме одного: я не могу понять, как создать <a> ссылки на дочерние действия контроллера! У меня нет проблем, включая дочерние действия в частичных представлениях при размещении почты и использовании Html.Action.

я пытался @Html.ActionLink и другие помощники, но ближе всего я, это ссылка на /umbraco/Surface/CompanySurface/Company, который, конечно, не работает и не содержит параметр id (например, Company/3).

Я также попытался поставить контроллеры в umbraco/Surface Пространство имен без удачи (и это не кажется необходимым).

Что мне здесь не хватает?

2 ответа

Решение

Я закончил тем, что использовал классический способ сделать параметры GET вместо этого. Это работает, потому что я выбираю все компании из БД и обрабатываю все в одном контроллере (например, EditCompany). Тогда я могу передать /EditCompany?companyId=xx

Это не красиво, но это нужно только для защищенных страниц, поэтому я пока не беспокоюсь о SEO.

Если нам действительно нужно заставить эту работу работать с пользовательскими контроллерами, нам нужно вместо этого реализовать пользовательский IContentFinder в Umbraco.

Прежде всего, мне интересно, почему вы не ставите компании в качестве узлов в вашем дереве контента, давая им собственный тип документа. Это приведет к очень простому коду:

@foreach(var company in Model.Children) 
{
  <a href="@company.Url">@company.Name</a>
}

Если приведенный выше подход не подходит, и вам нужно извлечь данные из внешней (не зонтичной) таблицы, то делайте то, что вы делаете. За исключением того, что вы не можете создать <a> к действию ребенка! Это не то, что umbraco запрещает, это защита ASP.Net MVC, поэтому пользователи не могут "взломать" действия вашего ребенка. Что вы действительно хотите использовать, так это RenderMvcController (см. Документацию). Есть еще один вопрос, касающийся различий между RenderMvcController и SurfaceController.

Другие вопросы по тегам