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 при редактировании страницы