2013-02-12 3 views
1

Я после этого tutorial, и создал этот код:Sitecore контекст не загружен в пользовательском контроллере

using Glass.Sitecore.Mapper; 
using Sitecore.Mvc.Controllers; 
using Sitecore.SecurityModel; 
using SitecoreCMSMVCBase.Models; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace SitecoreCMSMVCBase.Controllers 
{ 
    public class CommentController : SitecoreController 
    { 
     ISitecoreContext _context; 
     ISitecoreService _master; 

     public CommentController() 
      : this(
      new SitecoreContext(), 
      new SitecoreService("master")) 
     { 

     } 
     /// <summary> 
     /// This constructor can be used with dependency injection or unit testing 
     /// </summary> 
     public CommentController(ISitecoreContext context, ISitecoreService master) 
     { 
      _context = context; 
      _master = master; 
     } 

     [HttpGet] 
     public override ActionResult Index() 
     { 
      var model = _context.GetCurrentItem<CommentPage>(); 
      return View(model); 
     } 

     [HttpPost] 
     public ActionResult Index(Comment comment) 
     { 
      var webModel = _context.GetCurrentItem<CommentPage>(); 

      if (ModelState.IsValid) 
      { 
       var masterModel = _master.GetItem<CommentPage>(webModel.Id); 

       if (masterModel.CommentFolder == null) 
       { 
        CommentFolder folder = new CommentFolder(); 
        folder.Name = "Comments"; 

        using (new SecurityDisabler()) 
        { 
         _context.Create(masterModel, folder); 
        } 
        masterModel.CommentFolder = folder; 
       } 

       using (new SecurityDisabler()) 
       { 
        comment.Name = DateTime.Now.ToString("yyyyMMddhhmmss"); 

        //create the comment in the master database 
        _master.Create(masterModel.CommentFolder, comment); 
        webModel.CommentAdded = true; 
       } 
      } 

      return View(webModel); 
     } 
    } 
} 

Модель идентична с уроком, поэтому я не буду вставлять их.

Моя конфигурация маршрут выглядит следующим образом:

routes.MapRoute(
    "CommentController", // Route name 
    "Comment/{action}/{id}", // URL with parameters 
    new { controller = "Comment", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 

Когда я перейти к /comment я вижу это исключение:

Glass.Sitecore.Mapper.MapperException: Context has not been loaded 

Я попытался с комментируя свою спецификацию маршрута (так как не было ничего о маршрутах в), а затем ошибка отличается (бросание по Sitecore CMS):

T он запросил документ не найден

Знаете ли вы, как загрузить контекст Sitecore в пользовательский контроллер и сделать этот простой пример работы? Я искал везде, но не нашел никакого хорошего ответа ...

ответ

1

Этот метод совершенно не нужен.

Первым шагом является установление вашего маршрута в файле Global.asax.

routes.MapRoute(
    "DemoController", // Route name 
    "Demo/{action}/{param}", // URL with parameters 
    new { controller = "Demo", action = "Index", param = "", scItemPath = "/sitecore/content/DemoHomePage" } // Parameter defaults 
); 

Обратите внимание, что контроллер не принимается за параметр, а фиксирован, чтобы предотвратить его использование Sitecore. Больше информации here и here. Обратите внимание, что есть еще один параметр - scItemPath. Он содержит путь к элементу, который по умолчанию будет включен в контекст страницы.

Имея этот маршрут, наш трафик от /demo обрабатывается DemoController и Index действиями. Внутри этого действия все, что вам нужно, это добавить это строка:

Sitecore.Data.Items.Item item = Sitecore.Mvc.Presentation.PageContext.Current.Item; 

item переменными будет содержать вашу деталь Sitecore указала на scItemPath.

И это все - он должен хорошо работать сейчас - надеюсь, что это поможет!

4

Я думаю, что это скорее проблема с установкой стекла, а не проблема маршрутизации MVC. Чтобы настроить Glass, вам необходимо инициализировать контекст в методе запуска приложения в файле Global.asax.

var loader = new Glass.Sitecore.Mapper.Configuration.Attributes.AttributeConfigurationLoader(
     "Glass.Sitecore.Mapper.Tutorial.Models, Glass.Sitecore.Mapper.Tutorial"); 

Glass.Sitecore.Mapper.Context context = new Context(loader); 

Для других материалов, связанных с установкой стекла, я рекомендую следовать первому учебнику на веб-сайте glass.lu. http://www.glass.lu/tutorials/glass-sitecore-mapper-tutorials/tutorial-1-setup/

+0

Я нашел другой способ получить контекст Sitecore и полностью избавился от Glass от проекта. Но это хороший ответ. – Karol

+1

, что ссылка сейчас мертва – Liam

Смежные вопросы