自定义部分&自定义树MVC方法

时间:2017-08-01 14:40:15

标签: asp.net-mvc model-view-controller umbraco umbraco7

我花了好几个小时试图让自定义树显示在umbraco的自定义部分中。 - 取得成功。

到目前为止,我已设法创建一个新的部分,但是当我点击该部分时没有任何反应。

应该发生的是自定义树应该与一个节点一起显示。单击该节点时应显示MVC视图。

这是我到目前为止所做的,它基于本教程。

http://www.jondjones.com/learn-umbraco-cms/umbraco-developers-guide/customising-umbraco-ui/how-to-display-an-mvc-view-in-the-umbraco-backend

一个。创建部分

Thread.currentThread().isInterrupted()

B中。创建树

{
    [Application("rewards", "Rewards", "icon-gift", 15)]
    public class RewardsSection: IApplication
    {
    }
}

℃。 RegisterRoutes(在ApplicationStarted上调用)

[Tree("rewards", "rewardsTree", "Rewards")]
[PluginController("Rewards")]
public class RewardsTree : BaseTree
{
    public RewardsTree(string application)
        : base(application)
    { }

    protected override void CreateRootNode(ref XmlTreeNode rootNode)
    {
        rootNode.NodeType = "rewards";
        rootNode.NodeID = "-1";
        rootNode.Menu = new List<IAction> { ActionRefresh.Instance };

    }

    public override void Render(ref XmlTree tree)
    {
        var IndexNode = XmlTreeNode.Create(this);
        IndexNode.NodeID = "0";
        IndexNode.NodeType = "Home";
        IndexNode.Text = "Home";
        IndexNode.Action = "javascript:openPage('/umbraco/backoffice/Plugins/Rewards/Index');";
        IndexNode.Icon = "icon-home";
        IndexNode.HasChildren = false;
        IndexNode.Menu = new List<IAction>();
        OnBeforeNodeRender(ref tree, ref IndexNode, EventArgs.Empty);

        if (IndexNode != null)
        {
            tree.Add(IndexNode);
            OnAfterNodeRender(ref tree, ref IndexNode, EventArgs.Empty);
        }
    }

    public override void RenderJS(ref StringBuilder Javascript)
    {
        var js = $"function openPage(url){{UmbClientMgr.contentFrame(url);}}";
        Javascript.Append(js);
    }

    protected override void CreateAllowedActions(ref List<IAction> actions)
    {
        actions.Clear();
        actions.Add(ActionNew.Instance);
        actions.Add(ActionDelete.Instance);
        actions.Add(ContextMenuSeperator.Instance);
        actions.Add(ActionRefresh.Instance);
    }
}

d。后端控制器 - 我希望看到的返回视图。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
          name: "Default",
          url: "umbraco/backoffice/Plugins/{controller}/{action}/{id}",
          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );
}
public class StartUpHandlers : ApplicationEventHandler
{
    protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
    {
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }
}

那么我错过了什么?

我在RewardsTree Class中放置了断点,但没有一个被击中。

我还在应用程序启动时设置了断点,并且这些断点正在被击中,因此我非常确定路线配置正确。

我有什么遗失的吗?我见过使用TreeBtroller的TreeBtroller的其他例子,这让我有些困惑。

有什么想法吗? - 非常困难

1 个答案:

答案 0 :(得分:2)

我设法在自定义部分显示自定义树!最后! -

我遇到的问题有两个。

从在线的所有教程中,您将了解如何在定义自定义树时执行此操作,一些教程继承自BaseTree,其他教程继承自TreeController -

我已经让它继承了TreeController的工作,据我所知,使用BaseTree是一种很老的方式&#39;这样做。

我正在运行Umbraco版本7.6.4程序集:1.0.6396.36621 - 我不确定旧版本是否可以使用此版本,但我无法使其工作。

因此,在按照本书第16章(自定义章节,树木和动作)中的指导方针后:https://github.com/kgiszewski/LearnUmbraco7

我得到了我的项目进行编译和运行,自定义部分出现了,但自定义树没有,当我点击自定义部分时出现错误。

System.NullReferenceException:未将对象引用设置为对象的实例。

堆栈跟踪的一部分如下所示:

Umbraco.Web.Trees.ApplicationTreeExtensions.TryLoadFromControllerTree(ApplicationTree appTree,String id,FormDataCollection formCollection,HttpControllerContext controllerContext),位于Umbraco.Web.Trees.ApplicationTreeController.d__17.MoveNext()---来自上一个位置的堆栈跟踪结束引发了异常 -

为什么会发生这种情况并不明显,但经过一些研究后我得出结论是因为....................

我正在使用IoC contanier,为此我需要确保TreeController在容器中注册! - 这是与创建自定义树相关的任何文档或教程中未提及的内容。该文档假设您使用Umbraco而不使用IoC容器。

在我的情况下,我使用Autofac,所以我所要做的就是将其添加到我的容器注册码中:

builder.RegisterApiControllers(typeof(RewardsTreeController).Assembly);

然后突然一切正常!

真的希望这有助于其他人。

Umbraco(7.6.4)/ Autofac.Mvc5(4.0.2)/ Autofac.WebApi2(4.0.1)/&lt;&lt;这是为我工作的nuget包的组合。