EPiServer 7 & Mvc - локальный блок с контроллером (и тегом) - не обновляется автоматически при редактировании страницы

Я использую EPiServer 7.5+ и имею сценарий, в котором некоторые из моих локальных блоков не обновляются после редактирования в окне редактирования страницы.

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

Почему некоторые локальные блоки не обновляются правильно?

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

Пример кода

Страницы / блоки:

[ContentType("nguid")]
public class SimpleLocalBlock : BlockData{
    public virtual string Text {get;set;}
}

[ContentType("nguid")]
public class AdvancedLocalBlock : BlockData{
    public virtual string Text {get;set;}
} 

[ContentType("nguid")]
public class MyPage : PageData
{
   public virtual SimpleLocalBlock Simple {get;set;}
   public virtual AdvancedLocalBlock Advanced {get;set;}
}

контроллер:

public class AdvancedLocalBlockController : BlockController<AdvancedLocalBlock>
{
    public override ActionResult Index(MultiLinksBlock currentContent)
    {
        return PartialView(ViewPath, currentContent);
    }

    //Use ViewData["Tag"] to decide which View to use
    public virtual string ViewPath
    {
        get
        {
            var tag =
                this.ControllerContext.ParentActionViewContext.ViewData["Tag"]
                        as AdvancedViews?;

            if (tag.HasValue)
            {
                switch (tag)
                {
                    case AdvancedViews.View1:
                        return "~/Views/Shared/Blocks/View1.cshtml";

                    case AdvancedViews.View1:
                        return "~/Views/Shared/Blocks/View2.cshtml";
                 }
            }

            throw new Exception("Invalid Tag.");
        }
    }

Enum для контроля, какой View используется:

public Enum AdvancedViews
{
    View1 = 1,
    View2 = 2
}

Вид (бритва) - MyPage

@model MyPage 

@Html.PropertyFor(x => x.Simple)

@Html.PropertyFox(x => x.Advanced, new {Tag = AdvancedViews.View1})

Вид (бритва) - SimpleLocalBlock

@model SimpleLocalBlock

@Html.PropertyFor(x => x.Text)

View (Razor) - View1

@model AdvancedLocalBlock

@Html.PropertyFor(x => x.Text)

Резюме

Я могу использовать Редактирование страницы при редактировании Simple и блок будет корректно обновляться на странице (т.е. не нужно обновлять всю страницу). Но когда я использую "Редактирование страницы" с "Расширенными", я не вижу обновлений, пока не обновлю всю страницу.

1 ответ

Решение

После использования Fiddler для проверки работы EPiServer после редактирования на странице я понял, AdvancedLocalBlockController выдает исключение, потому что EPi неправильно возвращает ViewData.

Мой словарь ключа просмотра Tag был в нижнем корпусе tag и значение Enum (int) было передано вместо экземпляра Enum.

В итоге я создал помощника для поддержки EPi:

    public static T? ParseEnum<T>(this ViewDataDictionary d, string key)
        where T : struct
    {
        var dictObject = d[key];

        if (null == dictObject)
            return null;


        if (dictObject is T?)
            return dictObject as T?;

        T parsedEnum;
        if (Enum.TryParse(dictObject.ToString(), out parsedEnum))
            return parsedEnum;

        return null;
    }

а затем обновил мой контроллер:

var tag =
     this.ControllerContext.ParentActionViewContext.ViewData
         .ParseEnum<AdvancedViews>("tag");

После этого мой AdvancedLocalBlock правильно ведет себя в EPi при редактировании страницы

Другие вопросы по тегам