Я пытаюсь создать приложение Umbraco 7 MVC. При этом я хочу иметь возможность создавать собственные контроллеры, которые управляют данными за кулисами. В ходе моего исследования я обнаружил, что использование SurfaceController было наиболее успешным. Однако маршрут добавляет «/umbraco/surface/» на страницу. Например, мой тестовый контроллер и представление будут выглядеть как «/umbraco/surface/Test». Есть ли способ управлять этими маршрутами и просто перейти к «/Test», не добавляя к нему маршрут Umbraco? Любое руководство по созданию пользовательских контроллеров в Umbraco 7 будет полезно!
Umbraco 7 Обновление маршрутов Umbraco
Ответы (1)
это то, чего я достиг в своем проекте. Покопавшись в инете нашел решение:
В папке App_Code я создал файл Startup.cs с маршрутами:
using System.Web.Mvc; using System.Web.Routing; using Umbraco.Core; namespace mebli { public class MyStartupHandler : IApplicationEventHandler { public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { //Create a custom routes // News controller RouteTable.Routes.MapRoute( "", "News", new { controller = "News", action = "Index", id = "0" }); RouteTable.Routes.MapRoute( "", "News/Index", new { controller = "News", action = "Index", id = "0" }); RouteTable.Routes.MapRoute( "", "News/{id}", new { controller = "News", action = "Index", id = UrlParameter.Optional }); } public void OnApplicationInitialized( UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { } public void OnApplicationStarting( UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) { } } }
Это позволяет вам иметь нужные вам маршруты, в моем случае site.com/News, site.com/News/Index для индекса, site.com/ News/123 для отдельных новостей.
Тогда мой NewsController выглядит так:
using System.Globalization; using System.Linq; using System.Web; using System.Web.Mvc; using Examine; using Umbraco.Core.Models; using Umbraco.Web; using Umbraco.Web.Models; using Umbraco.Web.Mvc; namespace mebli.Controllers { public class NewsController : PluginController { public NewsController() : this(UmbracoContext.Current) { } public NewsController(UmbracoContext umbracoContext) : base(umbracoContext) { } public ActionResult Index(string id) { var criteria = ExamineManager.Instance.DefaultSearchProvider.CreateSearchCriteria("content"); var filterNews = id == "0" ? criteria.NodeTypeAlias("News") : criteria.NodeTypeAlias("News").And().NodeName(id); var resultNews = Umbraco.TypedSearch(filterNews.Compile()).ToArray(); if (!resultNews.Any()) { throw new HttpException(404, "No product"); } if (id == "0") { criteria = ExamineManager.Instance.DefaultSearchProvider.CreateSearchCriteria("content"); var filterNewsRepository = criteria.NodeTypeAlias("NewsRepository"); var newsRepository = Umbraco.TypedSearch(filterNewsRepository.Compile()); var renderModel = CreateRenderModel(newsRepository.First()); return View("NewsIndex", renderModel); } else { var renderModel = CreateRenderModel(resultNews.First()); return View("News", renderModel); } } private RenderModel CreateRenderModel(IPublishedContent content) { var model = new RenderModel(content, CultureInfo.CurrentUICulture); //add an umbraco data token so the umbraco view engine executes RouteData.DataTokens["umbraco"] = model; return model; } } }
Он унаследован от PluginController Umbraco, не спрашивайте почему :)
И в-третьих, у меня есть два представления, вызываемые из контроллера: NewsIndex для индекса и News для отдельных новостей. Например, мой NewsIndex.cshtml находится здесь:
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage @{ Layout = "~/Views/Page.cshtml"; } <div id="main-content" class="body news narrow"> <h2>@Model.Content.GetPropertyValue("header")</h2> <ul> @foreach (IPublishedContent news in Model.Content.Children.OrderBy("date desc")) { <li> <span>@Helpers.FormatDate(news.GetPropertyValue("date"))</span> <div> <a href="@Url.Action("Index", "News", new { id = news.Name })">@Helpers.StripHtml(news.GetPropertyValue("Brief").ToString())</a> </div> </li> } </ul> <div class="clr"></div> </div>
На самом деле я не могу объяснить каждую строку в этом коде, потому что недавно начал изучать ASP.Net MVC и Umbraco. Но идея ясна, я думаю. И это работает :)
person
The Yur
schedule
08.04.2014
Кстати, делая это, я обнаружил проблему, о которой следует знать: если шаблоны Razor или файлы макета отображают документы Umbraco, содержащие макросы, эти макросы не будут запускаться из-за отсутствия PublishedContentRequest.
- person The Yur; 20.06.2014
@TheYur У меня была аналогичная проблема с рендерингом макросов в следующая ветка. Похоже, проблема связана с отсутствующим
UmbracoContext
.
- person Marko Jovanov; 22.11.2015