我花了好几个小时试图让自定义树显示在umbraco的自定义部分中。 - 取得成功。
到目前为止,我已设法创建一个新的部分,但是当我点击该部分时没有任何反应。
应该发生的是自定义树应该与一个节点一起显示。单击该节点时应显示MVC视图。
这是我到目前为止所做的,它基于本教程。
一个。创建部分
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的其他例子,这让我有些困惑。
有什么想法吗? - 非常困难
答案 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包的组合。