2014-09-12 14 views
1

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

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

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

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

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

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

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

ответ

0

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

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

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

1

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

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

Если выше appoach не вариант, и вы должны извлекать данные из внешней таблицы (не Umbraco), а затем делать то, что вы делаете. Кроме того, вы не можете создать <a> дочернее действие! Это не то, что запрещено umbraco, это защита ASP.Net MVC, чтобы пользователи не могли «взломать» ваши дочерние действия. Что вы действительно хотите использовать, это RenderMvcController (see documentation). Есть еще один вопрос, копающий в difference between RenderMvcController and SurfaceController.

+0

Спасибо за помощь! Мое приложение, вероятно, в конечном итоге будет иметь тысячи компаний, поэтому не имеет смысла иметь узел на компанию, даже если он даст действительно чистый вид. Я не понимаю «взлом», который вы упомянули. MVC имеет стандартные маршруты как '{controller}/{action}/{id}' и не является прямой ссылкой? Как я понимаю из связанного с этим вопроса, Umbraco имеет только маршрутизацию для узлов контента (включая пользовательские контроллеры), но если '@ html.action (« myaction »,« mycontroller », params)' может найти свой путь, почему я тогда не возможность ссылки на/mycontroller/myaction/param? – lape

+0

Нужно ли нам создавать собственный код маршрутизации или расширения для простых не-umb-данных? – lape

+0

Нет, нет. Вы можете сбросить весь код в своем представлении. – dampee