Umbraco 7 Обновление маршрутов Umbraco

Я пытаюсь создать приложение Umbraco 7 MVC. При этом я хочу иметь возможность создавать собственные контроллеры, которые управляют данными за кулисами. В ходе моего исследования я обнаружил, что использование SurfaceController было наиболее успешным. Однако маршрут добавляет «/umbraco/surface/» на страницу. Например, мой тестовый контроллер и представление будут выглядеть как «/umbraco/surface/Test». Есть ли способ управлять этими маршрутами и просто перейти к «/Test», не добавляя к нему маршрут Umbraco? Любое руководство по созданию пользовательских контроллеров в Umbraco 7 будет полезно!


person floydbear    schedule 07.04.2014    source источник


Ответы (1)


это то, чего я достиг в своем проекте. Покопавшись в инете нашел решение:

  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 для отдельных новостей.

  2. Тогда мой 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, не спрашивайте почему :)

  3. И в-третьих, у меня есть два представления, вызываемые из контроллера: 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
comment
Кстати, делая это, я обнаружил проблему, о которой следует знать: если шаблоны Razor или файлы макета отображают документы Umbraco, содержащие макросы, эти макросы не будут запускаться из-за отсутствия PublishedContentRequest. - person The Yur; 20.06.2014
comment
@TheYur У меня была аналогичная проблема с рендерингом макросов в следующая ветка. Похоже, проблема связана с отсутствующим UmbracoContext. - person Marko Jovanov; 22.11.2015