Почему Glass Mapper возвращает нулевые значения?

Я использую Glass V4. У меня есть настройка проекта веб-области MVC.

Я установил Glass Mapper в основной проект (WebProject).

Я пытаюсь сделать литье стекла в моем районе.

 public class ContactController : SitecoreController
{
    private readonly ISitecoreContext _context;
    private IGlassHtml _glassHtml;

    public ContactController()
        : this(new SitecoreContext())
    {

    }
    public ContactController(ISitecoreContext context)
    {
        _context = context;
        _glassHtml = new GlassHtml(context);

    }

    // GET: Contact
    public ActionResult ContactUs()
    {
        var db = Sitecore.Context.Database;
        var datasource = db.GetItem(RenderingContext.Current.Rendering.DataSource);

        var ViewModel = new Models.ContactUs();
        ViewModel.Headerstring = datasource.Fields["Headerstring"].Value;
        ViewModel.Substring = datasource.Fields["Substring"].Value;
        ViewModel.Description = ((MultilistField)datasource.Fields["Description"]).GetItems().Select(s => s.Fields["Line"].Value).ToList<string>();

        return View(ViewModel);
    }

    public ActionResult ContactUsGlass()
    {
        var model = _context.GetCurrentItem<ContactUsGlassModel>();
        return View(model);
    }
}

Я могу получить значение с помощью первого метода действия, но не со вторым.

Модель:

public class ContactUs
{
    public string Headerstring { get; set; }
    public string Substring { get; set; }
    public List<string> Description { get; set; }
}

Стеклянная модель:

public class ContactUsGlassModel
{
    public virtual string Headerstring { get; set; }
    public virtual string Substring { get; set; }
}

Я понимаю, что мне не нужно регистрировать свое пространство имен в Glass V4.


person Sakthivel    schedule 07.11.2015    source источник
comment
Можете ли вы проверить, опубликован ли ваш элемент и есть ли у него версия на языке контекста?   -  person Vlad Iobagiu    schedule 07.11.2015
comment
@sitecoreclimber, да, видел.   -  person Sakthivel    schedule 07.11.2015


Ответы (3)


Вы не должны использовать метод _context.GetCurrentItem. Вместо этого используйте _context.GetItem:

public ActionResult ContactUsGlass()
{
    var model = context.GetItem<ContactUsGlassModel>(RenderingContext.Current.Rendering.DataSource);
    return View(model);
}

Вы не хотите получать модель из своего Sitecore.Context.Item (который используется в методе GetCurrentItem. Вы хотите получить свою модель из DataSource текущего рендеринга.

person Marek Musielak    schedule 07.11.2015
comment
Я обновил код, var model = _context.GetItem‹ContactUsGlassModel›(RenderingContext.Current.Rendering.DataSource); Но теперь я не могу протестировать код из-за RenderingContext. не могли бы вы посоветовать по этому поводу. - person Sakthivel; 08.11.2015

То, что ответил @Marek, - это правильный способ вытащить элемент рендеринга в модель. GetCurrentItem по умолчанию предоставляет элемент страницы, обслуживаемый Sitecore. Если поля, необходимые вашей модели, являются полями вашего элемента страницы, то GetCurrentItem также может заполнить вашу модель. Если включена вложенность источника данных, то, если источник данных не установлен в рендеринге, Sitecore снова возвращает элемент страницы.

person phani    schedule 07.11.2015
comment
@Sakthivel, вы можете вытащить интерфейс IRenderingContext из класса RenderingContext. Создайте связыватель модели MVC для IRenderingContext и зарегистрируйте его. Я обычно использую этот шаблон для большинства свойств, связанных с Sitecore.Context. Также стоит отметить этот шаблон для GlassModelBinder. Хотя и не так, я использую аналогичный подход в своих решениях link - person phani; 08.11.2015
comment
Обязательно попробую и этот... Спасибо...! - person Sakthivel; 08.11.2015

Вы можете наследовать от GlassController, а затем использовать GetLayoutItem() для получения элемента данных. Если он нулевой, вам нужно опубликовать шаблон в sitecore и убедиться, что сопоставления верны, если вы не используете TDS :)

person Charlie Afford    schedule 07.11.2015