【问题标题】:Umbraco Razor, comparing 2 sets of page ID's in a string for any matchesUmbraco Razor,比较字符串中的两组页面 ID 是否匹配
【发布时间】:2019-02-21 03:21:28
【问题描述】:

最初使用 .Contains() 当我的 2 个比较项目类似于, 是:

1234

在:

5555 6732 **1234** 3456

在这种情况下,是的,并且代码将在 if() 上运行,但是当我引入多重比较时,例如,

是:

**1234** 2344 2341 3245

在:

5555 6732 **1234** 3456

它不再适用于 .Contains(),因此我正在寻找如何最好地比较任何匹配的 2 个字符串,如果 any 四个数字块在两个字符串中十。

数字块目前每个都在一个字符串中,例如“placeIDs”和“adIDs”,每个数字之间都有空格。

如果您愿意,这是我的完整代码:

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@using RJP.MultiUrlPicker.Models;
@{
string pagesID = "";
string adPlace = "";
var selection = Umbraco.TypedContent(1384).Children("headerAdvert").Where(x => x.IsVisible() && x.GetPropertyValue<bool>("active"));
    foreach(var item in Model.Content.Ancestors().OrderBy(x => x.Level))
        {
            pagesID = string.Concat(@item.Id.ToString(),"  ",pagesID);
        }
            pagesID = string.Concat(@Model.Content.Id.ToString(),"  ",pagesID);
            @:Page ID's @pagesID
     }

<div id="leaderboard" class="advert-carousel owl-carousel owl-theme" style="opacity: 1; display: block;">
    <div class="owl-wrapper-outer">
<div class="headerSlick owl-wrapper">
    @{
    foreach(var item in selection){
        var dateRange = item.GetPropertyValue<Diplo.DateRangePicker.DateRange>("campaignDate");
        <p>Your date range is from @dateRange.StartDate to @dateRange.EndDate</p>
        var typedMultiNodeTreePicker = item.GetPropertyValue<IEnumerable<IPublishedContent>>("location");
        foreach (var item2 in typedMultiNodeTreePicker)
            {
                adPlace = string.Concat(@item2.Id.ToString(),"  ",adPlace);
            }

        @:ad target ID's @adPlace
        if(item.HasValue("location") && pagesID.Contains(adPlace.ToString())){
        <script>alert("yes")</script>
        var singleLink = item.GetPropertyValue<Link>("links");
            if(singleLink != null)
            {
                if(item.HasValue("wideImage"))
                    {  
                    IPublishedContent mediaItem = item.GetPropertyValue<IPublishedContent>("wideImage");
                        <div class="owl-item" style="width: 891px;"><a href="@singleLink.Url" target="@singleLink.Target">
                            <img class="tag-headadvert img-responsive" style="display: inline;" src="@mediaItem.Url" width="100%" alt="@singleLink.Name" /></a>
                        </div> 
                    }
            }
        }

        else if (item.IsNull("location")){
        var singleLink = item.GetPropertyValue<Link>("links");
            if(singleLink != null)
            {
                if(item.HasValue("wideImage"))
                    {  
                    IPublishedContent mediaItem = item.GetPropertyValue<IPublishedContent>("wideImage");
                       <div class="owl-item" style="width: 891px;"><a href="@singleLink.Url" target="@singleLink.Target"><img class="img-responsive" src="@mediaItem.Url" width="100%" alt="@singleLink.Name" /></a></div> 
                    }
            }
        }
    }
}
</div>
</div>
</div>

但总而言之,我将页面的 ID 及其所有父 ID 设为字符串,然后将广告位置 ID 设为字符串,并尝试查找另一个 ID 是否存在。我很乐意重做任何东西,但我是这方面的初学者,所以请耐心等待。 ;-)

干杯

【问题讨论】:

    标签: string loops razor umbraco contains


    【解决方案1】:

    欢迎来到 StackOverflow :)

    如果你将你的字符串放入一个数组中,你可以在它们上运行 Contains。 由于您知道您的条目之间总是用空格分隔,因此您可以简单地执行以下操作:

    var allMyAdIds = "1234 2387 1931 2313 8237 2391 3911 2833 9741 1234";
    var adIDs = allMyAdIds.Split(' ');
    if (adIDs.Contains("1234"))
    {
        // DO X
    }
    

    对于多个包含,您可以这样做:

    var targetsToMatch = new[]{"1234", "7851", "9138"};
    foreach (var item in targetsToMatch) {
        if (adIDs.Contains(item)) {
            // DO X
        }
    }
    

    【讨论】:

    • 谢谢 :-) 我正在实现这个,但只是担心你把 1234 放在哪里,也可能有倍数,那它还可以工作吗?有点像“做这个集合中的任何东西,匹配那个集合中的任何东西”
    • 我已经编辑了答案以支持多个目标:) 我希望它有意义。
    • 谢谢,我很抱歉我以前从未使用过这种方法,所以我确实有些困惑,用你的 targetsToMatch 数组,这是为了替换我的“adPlace = string.Concat(@item2.Id. ToString()," ",adPlace);"行,我在哪里将它们合并在一起?
    • 我现在已经把代码硬塞到了一起,在这个馅饼里; pastiebin.com/5ba2500d62739 但我只需要让顶部变量“pagesID”成为数组的源。
    • 谢谢,工作很好,我现在也意识到在这个用例中,我只希望它在匹配时运行一次循环,“foreach (var it3m in targetsToMatch) {”目前,我认为每场比赛都有输出?理想情况下,我只想遍历数组,找到 1 或 100 个匹配项,然后执行一次。谢谢 Mikkel,你帮了大忙。
    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多