当然是Umbraco新手..
我有一些代码返回给定节点id的某些数据类型内容,详见此处:
umbraco API: trying to get the document type data for a given site node
工作正常,但我必须知道起始节点,即在我的情况下是站点节点id(多站点umbraco安装)。
我也知道你可以通过以下方式获得主根节点:
Umbraco - Finding Root Node in C#
我的问题是这个......
从后端API,无论如何都要动态获取当前站点节点ID(第一个链接)?这是我不必提前知道的。我认为有一个选项可以从查询字符串中获取网站ID .. Page.Request.QueryString [“id”]但是我猜这是在页面是模板页面时返回的,但这是来自后端类吗? / p>
还有吗?或者我正在咆哮错误的树! ??
任何帮助都将不胜感激!!
答案 0 :(得分:3)
假设你有一个Umbraco安装,其中有两个网站及其各自的主页和页面,例如
在C#中,可以使用
获取当前节点Node currentNode = Node.GetCurrent();
及其对应的主节点可以通过
找到Node currentHome = new Node(int.Parse(currentNode.Path.Split(',')[1]));
现在,currentNode.Path
返回以逗号分隔的整数字符串,以-1开头,
即根,你所谓的主根,所有主页的“直播”。
E.g。第2.1页的路径值为“ - 1,1002,1003”。当用逗号分割时,你最终会得到一个包含3个元素索引为0,1,2的数组。现在,第二个索引1 将提供主节点的 ID 。如您所见,最后一个id是当前节点的id。另外,索引也告诉节点的级别,因此主页的级别为1。
我在Intranet / Extranet上使用的模板上使用了以下脚本并且具有受保护的页面。当访问者跟踪指向受保护页面的链接时,他/她将被拒绝访问并重定向到具有成员登录名的主页。
<%@ Master Language="C#" MasterPageFile="~/umbraco/masterpages/default.master" AutoEventWireup="true" %>
<%@ Import Namespace="umbraco.NodeFactory" %>
<script runat="server" language="CSharp">
protected void Page_Load(object sender, EventArgs e)
{
// prevents template to be run without proper authorisation
Node currentNode = Node.GetCurrent();
Node currentHome = new Node(int.Parse(currentNode.Path.Split(',')[1]));
Boolean HasAccess = umbraco.library.HasAccess(currentNode.Id, currentNode.Path);
Boolean IsProtected = umbraco.library.IsProtected(currentNode.Id, currentNode.Path);
if (IsProtected && !HasAccess)
{
// redirect to ancestor-or-self::HomePage
Response.Status = "403 Forbidden";
Response.Redirect(umbraco.library.NiceUrl(currentHome.Id), true);
}
}
</script>
<asp:Content ContentPlaceHolderID="ContentPlaceHolderDefault" runat="server">
<!-- redirect to home page -->
</asp:Content>
答案 1 :(得分:1)
假设您的所有根节点都是相同的文档类型,在剃刀中您可以执行以下操作:
var folderId = @ Model.AncestorOrSelf(“MyFolderType”)。Id;
将从当前节点“向上”或“向后”搜索,直到达到指定类型的节点类型。
另一种方式可以在这里找到:
http://our.umbraco.org/forum/developers/api-questions/20742-Getting-the-home-node-using-c