用c#中的其他文本替换变量文本

时间:2016-04-20 15:48:44

标签: c# sitecore

我使用c#和sitecore基本上在某些地方使用令牌(参见:how to create a custom token in sitecore)。我想我有一个解决方案,但我不确定为什么它不起作用,即使我没有错误。

Item tokenItem = Sitecore.Context.Database.Items["/sitecore/content/Site Content/Tokens"];

if (tokenItem.HasChildren)
{
    var sValue = args.FieldValue.ToString();

    foreach (Item child in tokenItem.Children)
    {
        if (child.Template.Name == "Token")
        {
            string home = child.Fields["Title"].Value;
            string hContent = child.Fields["Content"].Value;
            if (sValue.Contains(home))
            {
                home.Replace(home, hContent);
            }
        }
    }
}

home和hContent拉出每个容器的正确值,但是当页面加载时,它仍然在内容区域输入“home”值(即:@@ sales)而不是新值,即存储在hContent中。 sValue包含所有内容(表格,div,文本),我试图挑出一个等于“home”的值,并用hContent替换“home”值。我错过了什么?

4 个答案:

答案 0 :(得分:4)

你的代码并没有真正做任何事情。您似乎正在替换令牌项字段本身(child.Fields["Title"]child.Fields["Content"])上的令牌,而不是输出内容流上的令牌。

尝试以下操作,您需要将args设置为替换值,替换FirstPartLastPart属性:Replace Tokens in Rich Text Fields Using the Sitecore ASP.NET CMS(链接到&#34中的代码;未经测试的原型"链接)。

我会重构您的代码以使其更容易:

public void Process(RenderFieldArgs args)
{
    args.Result.FirstPart = this.Replace(args.Result.FirstPart);
    args.Result.LastPart = this.Replace(args.Result.LastPart);
}

protected string Replace(string input)
{
    Item tokenItem = Sitecore.Context.Database.Items["/sitecore/content/Site Content/Tokens"];

    if (tokenItem.HasChildren)
    {
        foreach (Item child in tokenItem.Children)
        {
            if (child.Template.Name == "Token")
            {
                string home = child.Fields["Title"].Value;
                string hContent = child.Fields["Content"].Value;
                if (input.Contains(home))
                {
                    return input.Replace(home, hContent);
                }
            }
        }
    }

    return input;
}

这仍然不是最佳选择,但让你更接近。

答案 1 :(得分:4)

如果您的代码是作为RenderField管道的处理器实现的,则需要将工作结果放回到args中。尝试这样的事情:

Item tokenItem = Sitecore.Context.Database.Items["/sitecore/content/Site Content/Tokens"];

if (tokenItem.HasChildren)
{
    var sValue = args.Result.FirstPart;

    foreach (Item child in tokenItem.Children){
        if (child.Template.Name == "Token") {
            string home = child.Fields["Title"].Value;
            string hContent = child.Fields["Content"].Value;
            if (sValue.Contains(home)) {
                sValue = sValue.Replace(home, hContent);
            }
        }
    }

    args.Result.FirstPart = sValue;
}

请注意,您需要确保在GetFieldValue处理器之后将此处理器修补到管道中。该处理器负责将字段值提取到args.Result.FirstPart

答案 2 :(得分:2)

嗯,你知道当你执行home.Replace(home, hContent);时会发生什么,它会通过用hContent中的内容替换来的内容来创建一个新的实例,所以你需要做的是,分配此实例为新变量或home本身。因此,该片段将如下所示:

 if (sValue.Contains(home))
 {
    home = home.Replace(home, hContent);
 } 

答案 3 :(得分:1)

你试过了吗?

 home = home.Replace(home,hContent);