C# episerver7&;Mvc-带控制器(和标签)的本地块-不';t在页内编辑中自动刷新

C# episerver7&;Mvc-带控制器(和标签)的本地块-不';t在页内编辑中自动刷新,c#,asp.net-mvc,razor,episerver,episerver-7,C#,Asp.net Mvc,Razor,Episerver,Episerver 7,我使用的是EPiServer 7.5+,有一个场景,我的一些文件在页面编辑窗口中编辑后没有更新 我要么在编辑受影响的本地块后进行整页刷新,要么使用,这只会刷新整页 为什么某些本地块不能正确刷新? 经过调查,我注意到这个问题只影响有自己控制器的本地块 示例代码 页面/块: [ContentType("nguid")] public class SimpleLocalBlock : BlockData{ public virtual string Text {get;set;} } [Co

我使用的是EPiServer 7.5+,有一个场景,我的一些文件在页面编辑窗口中编辑后没有更新

我要么在编辑受影响的本地块后进行整页刷新,要么使用,这只会刷新整页

为什么某些本地块不能正确刷新?

经过调查,我注意到这个问题只影响有自己控制器的本地块

示例代码

页面/块:

[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.");
        }
    }
var tag =
     this.ControllerContext.ParentActionViewContext.ViewData
         .ParseEnum<AdvancedViews>("tag");
查看(剃须刀)-MyPage

视图(剃须刀)-SimpleLocalBlock

@model SimpleLocalBlock

@Html.PropertyFor(x => x.Text)
视图(剃须刀)-视图1

摘要

我可以在编辑
Simple
时使用页内编辑,块将在页面内联正确刷新(即不需要刷新整个页面)。但是,当我使用“高级”进行页面编辑时,直到刷新整个页面时,我才看到更新。

在使用检查EPiServer在页面编辑后所做的操作后,我意识到
AdvancedLocalBlockController
引发异常,因为EPi没有正确返回ViewData

My View Dictionary键
Tag
的大小写为
Tag
,传递的是枚举值(int),而不是枚举实例

我最终创建了一个帮助器来支持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;
    }
publicstatict?ParseEnum(此ViewDataDictionary已解析,字符串键)
其中T:struct
{
var dictObject=d[key];
if(null==dictObject)
返回null;
如果(对象是T?)
将dictObject返回为T?;
牙本质;
if(Enum.TryParse(dictObject.ToString(),out parsedEnum))
回归分析;
返回null;
}
然后更新了我的控制器:

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.");
        }
    }
var tag =
     this.ControllerContext.ParentActionViewContext.ViewData
         .ParseEnum<AdvancedViews>("tag");
var标记=
this.ControllerContext.ParentActionViewContext.ViewData
.ParseEnum(“标签”);
之后,我的
AdvancedLocalBlock
在EPi页面编辑中表现正确

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