【问题标题】:Create a "normal" ASP.NET page which depends on an Umbraco master page创建一个依赖于 Umbraco 母版页的“普通”ASP.NET 页面
【发布时间】:2013-01-21 20:24:05
【问题描述】:

是否可以在 Umbraco 中创建一个继承主 Umbraco 母版页的普通网络表单页面?

我的客户需要一些复杂的功能,这些功能需要在 CMS 上下文之外的页面中完成。

我想知道是否可以从“正常”页面的构造函数中手动启动 Umbraco 上下文。目前我只是得到错误:

引发了“System.Web.HttpUnhandledException”类型的异常。 ---> System.NullReferenceException:对象引用未设置为实例 的一个对象。在 umbraco.item..ctor(IDictionary 元素,IDictionary 属性)在 umbraco.presentation.templateControls.ItemRenderer.GetFieldContents(Item 项目)在 umbraco.presentation.templateControls.ItemRenderer.ParseMacros(项目 item) 在 umbraco.presentation.templateControls.Item.OnInit(EventArgs e) 在 System.Web.UI.Control.InitRecursive(Control NamingContainer) 在 System.Web.UI.Control.InitRecursive(控件命名容器)在

谢谢 克里斯

【问题讨论】:

  • 您不能使用放置在特定页面上的用户控件来执行该功能吗?
  • 当然,但这会导致用户删除 CMS 内的主机页面。问题是您最终会用非 CMS 页面堵塞 CMS。
  • 另一个问题是,您不能“编写脚本”创建 CMS 资产,因此,当功能部署的开销依赖于手动配置时,这需要时间并且容易出错。如果我可以完全把 CMS 的东西排除在外,那么这样的东西会容易得多。
  • 我想我总是可以创建一个单独的非 Umbraco 母版页。虽然不理想。

标签: c# asp.net umbraco


【解决方案1】:

您可以使用备用模板直接引用模板,而无需关联内容页面。

您可以通过以下方式引用它:

http://www.yourdomain.com/page.aspx?altTemplate=templatename

http://www.yourdomain.com/page/templatename.aspx

这会阻止用户删除节点。

这有帮助吗?

【讨论】:

    【解决方案2】:

    我认为您可以实现您的要求;

    使页面脱离 Umbraco 控制的常用方法是使用 web.config 键 umbracoReservedUrls 和 umbracoReservedPaths - 这些是随 4.11.1 安装的键:

    <add key="umbracoReservedUrls" value="~/config/splashes/booting.aspx,~/install/default.aspx,~/config/splashes/noNodes.aspx,~/VSEnterpriseHelper.axd" />
    <add key="umbracoReservedPaths" value="~/umbraco,~/install/" />
    

    其次,如果您的顶级母版页不包含 umbraco 项目或宏或任何您可以在 Page PreInit 事件期间始终切换到母版页的东西

    protected void Page_PreInit(Object sender, EventArgs e)
    {
        this.MasterPageFile = "/umbraco/masterpages/default.master";
    }
    

    或者您可以使用@BeaverProj 概述的技术。

    编辑

    查看您的评论,我认为您无需进入 umbraco 的“上下文”即可获得 umbraco 数据。添加对 cms.dll 和 businesslogic.dll 的项目引用(umbraco 会将它们放在 bin 中),然后您可以在没有包装控件的情况下使用 umbraco 框架。比如内部editMacro.aspx页面直接使用框架:

                    <asp:DropDownList OnPreRender="AddChooseList" runat="server" ID="macroPropertyType"
                        DataTextFormatString="" DataTextField='macroPropertyTypeAlias' DataValueField="id"
                        DataSource='<%# GetMacroPropertyTypes()%>' SelectedValue='<%# ((umbraco.cms.businesslogic.macro.MacroPropertyType) DataBinder.Eval(Container.DataItem,"Type")).Id %>'>
                    </asp:DropDownList>
    

    【讨论】:

    • 谢谢。不幸的是,我的母版页确实包含 Umbraco 项目。我决定创建一个单独的非 Umbraco 母版页,该母版页在很大程度上复制了 Umbraco 母版页。我不想复制功能,但似乎没有其他办法。 (我想也许可以创建一个“假”的 Umbraco 上下文,使 Umbraco 母版页能够在正常页面下工作)。谢谢
    • 我认为你可以(现在我想起来了)因为 Umbraco 已经做到了。见编辑。
    【解决方案3】:

    您可以从 umbraco 母版页继承,像这样手动指定您的母版页

    MasterPageFile="../masterpages/umbracoPage.Master"

    这适用于 .aspx 页面,您在 plugin directory 中指定此页面

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多