-1

我正在使用 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.");
        }
    }

用于控制使用哪个视图的枚举:

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

查看 (Razor) - 我的页面

@model MyPage 

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

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

查看 (Razor) - SimpleLocalBlock

@model SimpleLocalBlock

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

查看(剃刀) - View1

@model AdvancedLocalBlock

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

概括

我可以在编辑时使用 On Page Editing,Simple并且该块将在页面上正确内联刷新(即不需要刷新整个页面)。但是,当我使用“高级”页面编辑时,在刷新整个页面之前我看不到更新。

4

1 回答 1

1

在使用Fiddler检查 EPiServer 在 On Page Edit 之后所做的事情后,我意识到AdvancedLocalBlockController由于 EPi 没有正确返回 ViewData 而引发了异常。

我的 View Dictionary 键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 On Page Editing 中的行为正确

于 2014-10-23T12:38:35.377 回答