在复合 C1 中,是否可以将页面元类型字段传递给 razor 函数
本文关键字:字段 类型 函数 razor C1 复合 是否 | 更新日期: 2023-09-27 18:35:11
我浏览了 C1 文档,似乎找不到任何将页面元类型字段传递给 razor 函数的文档或示例。
我将为我正在做的 POC 举一个非常简单的例子。我创建了一个页面元类型的页面,该页面具有tag
字段。这个tag
字段将被传递给一个 razor 函数,该函数将在 Flickr 中查询使用该字段中包含的值标记的所有图像。我也不想在 Razor 函数本身中配置它,以防在不使用此页面元类型的页面上使用 Razor 函数。
更新
据我所知,您不能说使用常量或从函数参数对话框中选择元类型字段,因此我只是添加了一个允许您选择元类型字段的参数。见下文。
@inherits RazorFunction
@functions {
public override string FunctionDescription
{
get { return "Some tweets based on keyword"; }
}
[FunctionParameter(Label="Flickr Data")]
public DataReference<MyNamespace.Flickr> FlickrData { get;set; }
[FunctionParameter(Label="Maximum tweets to show", DefaultValue = 5)]
public int MaxItems { get; set; }
}
@{
XNamespace atom = "http://www.w3.org/2005/Atom";
var feed = XDocument.Load("https://api.flickr.com/services/feeds/photos_public.gne?tags=" + this.FlickrData.Data.FlickrTag);
var items = feed.Descendants(atom + "entry").Take(this.MaxItems).Select(item => new {
Title = item.Element(atom + "title").Value,
Published = item.Element(atom + "published").Value,
Markup = item.Element(atom + "content").Value
});
}
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://www.composite.net/ns/function/1.0">
<head>
</head>
<body>
<p>
@Html.Raw(@Resources.FlickrAtomFeed.FlickrFeedForMessage) <strong>@FlickrData.Data.FlickrTag</strong>
</p>
<dl>
@foreach (var item in items) {
<dt>@Html.Raw(@item.Markup)</dt>
<dd>@item.Title
<em>@DateTime.Parse(item.Published).ToString("F"))</em>
</dd>
}
</dl>
</body>
</html>
从那里,如果我想在页面上使用该函数,我只需要确保该元类型字段位于该页面上。事实上,如果您尝试将函数添加到没有元类型字段的页面,它不会让您保存函数参数,因此很明显元类型字段需要位于该页面上。仍然不是我想要的,但它有效。
简而言之,如果您的函数插入到页面上,您可以:
- 获取当前页面 ID。(请参阅 http://docs.composite.net/Functions/Composite-C1-API/Sitemap-Navigator)
- 查询特定数据项(此页面上的标记)的元类型。(请参阅 http://docs.composite.net/Functions/Razor/Getting-C1-Data 和 http://docs.composite.net/Legacy/Razor/List-to-Details 以获取灵感)
- 处理检索到的数据。
该函数可以像这样(假设您的页面元类型是"My.Meta.Type"):
@using Composite.Data
@inherits RazorFunction
@functions {
public override string FunctionDescription
{
get { return "..."; }
}
}
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://www.composite.net/ns/function/1.0">
<head>
</head>
<body>
@using (DataConnection dataConnection = new DataConnection())
{
// (1) get the current page ID
SitemapNavigator sitemapNavigator = new SitemapNavigator(dataConnection);
Guid PageId = sitemapNavigator.CurrentPageNode.Id;
if (PageId != null)
{
// (2) Get the meta field from the current page
var myTag = Data.Get<My.Meta.Type>().Where(t => t.PageId == PageId).FirstOrDefault();
// (3) Process the tag the way you like
if(myTag != null)
{
<p>@myTag.Tag</p>
}
}
}
</body>
</html>