Ссылка на функцию из кода программной части внутри Repeater, чтобы получить другой URL-адрес элемента, если это необходимо.

Я работаю над обновлением кода для навигации по сайту, чтобы он мог включать проверку того, выбрано ли определенное поле в шаблоне или нет. Навигация построена с использованием повторителей и имеет кодирование в стиле linq. Навигация имеет 3 уровня глубины, и на любой странице может быть выбрано поле флажка с пометкой «Перенаправить на первый дочерний элемент». Если это поле отмечено, я бы хотел запустить эту функцию:

private string GetURL(ChaNavItem item)
{
    string returnedURL = string.Empty;

    // Check to see whether or nor a redirect to the first child is needed
    if (item.RedirectToFirstChild == true)
    {
        Item urlItem = db.Items[item.SitecoreID.ToString()];
        if (urlItem.HasChildren)
        {
            returnedURL = Sitecore.Links.LinkManager.GetItemUrl(urlItem.Children[0]);
        }
        else
        {
            returnedURL = item.URL;
        }
    }
    else
    {
        returnedURL = item.URL;
    }

    return returnedURL;
}

Эта функция берет элемент Sitecore и проверяет, какой URL следует вернуть. Я надеялся, что, может быть, я смогу как-то использовать эту функцию в ретрансляторе, где я устанавливаю ссылку. В настоящее время я просто получаю текущую ссылку на элемент и ничего больше:

<a href="<%# Sitecore.Links.LinkManager.GetItemUrl(Item) %>" runat="server" class="child"><%# Item.Fields["Menu Title"].Value %>

Кажется, что это должно быть просто, но это не так (по крайней мере, для меня). Вот код для справки, где настраиваются данные повторителя:

private void Page_Load(object sender, EventArgs e)
{
    currentItem = Sitecore.Context.Item;
    CurrentMenuTitle.Text = currentItem.Fields["Menu Title"].Value;
    var db = Sitecore.Context.Database;
    homePageItem = db.Items[homePageId];


    var TopLevelItems = currentItem.Children.Where(c => c.Fields["Hide From Menus"].Value != "1" && c.Fields["Hidden Page"].Value != "1");
    if (currentItem.TemplateID.ToString() != topLevelNavTemplateID)
    {
        var ancestors = currentItem.Axes.GetAncestors().ToList<Item>();
        foreach (Item ancestor in ancestors)
        {
            if (ancestor.TemplateID.ToString() == topLevelNavTemplateID)
            {
                TopLevelItems = ancestor.Children.Where(c => c.Fields["Hide From Menus"].Value != "1" && c.Fields["Hidden Page"].Value != "1");
            }
        }
    }
    SideNavRepeater.DataSource = TopLevelItems;
    SideNavRepeater.DataBind();

}

protected void SideNav_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    var secondTierItem = e.Item.DataItem as Item;
    Repeater SiteNavSndLevelRepeater = e.Item.FindControl("SiteNavSndLevelRepeater") as Repeater;
    var thirdTierNavItems = secondTierItem.Children
       .Where(c => c.Fields["Hide From Menus"].Value != "1" && c.Fields["Hidden Page"].Value != "1");

    var arrowContainer = e.Item.FindControl("RightArrowContainer") as Panel;
    var indentationContainer = e.Item.FindControl("IndentedItemContainer") as Panel;

    if (thirdTierNavItems.Count() == 0)
    {
        arrowContainer.Visible = false;
        indentationContainer.Visible = true;
    }

    SiteNavSndLevelRepeater.DataSource = thirdTierNavItems;
    SiteNavSndLevelRepeater.DataBind();

}

protected void SiteNavSndLevel_ItemDataBound(object sender, RepeaterItemEventArgs e)
{

    var secondTierItem = e.Item.DataItem as Item;
    Repeater SiteNavThirdLevelRepeater = e.Item.FindControl("SiteNavThirdLevelRepeater") as Repeater;
    var fourthTierNavItems = secondTierItem.Children
       .Where(c => c.Fields["Hide From Menus"].Value != "1" && c.Fields["Hidden Page"].Value != "1" && c.TemplateID.ToString() != "{5525F19B-B6E9-468E-934B-C4420C50B841}")
       .ToList();

    SiteNavThirdLevelRepeater.DataSource = fourthTierNavItems;
    SiteNavThirdLevelRepeater.DataBind();
}

person Dejsa Cocan    schedule 24.03.2017    source источник


Ответы (1)


Вы используете метод следующим образом:

<ItemTemplate>
    <%# GetURL(Eval("myValue").ToString()) %>
</ItemTemplate>

И в коде позади. Убедитесь, что метод public

public string GetURL(string input)
{
    return "It works!";
}

Или, если метод находится не в .cs самой страницы, а в другом классе, необходимо указать полное пространство имен.

<%# Project1.Class.GetURL(Eval("myValue").ToString()) %>
person VDWWD    schedule 24.03.2017
comment
Извините за поздний ответ... кажется, проблема решена. Спасибо! - person Dejsa Cocan; 29.03.2017