1

基本的に別のカテゴリであるナビゲーション オブジェクトの親を持つカテゴリ オブジェクト (EF で取得) があります。

これらの Category オブジェクトは、Parent が null になるまで再帰を続けます。

私が得る必要があるもの:

<ul>
    <li>Highest level category (parent=null)</li>
    <li>
        <ul>
            <li>Second highest level category</li>
            <ul>
                <li>Local category</li>
            </ul>
        <ul>
    </li>
</ul>

できれば、大量の文字列操作を行わずに (大量のクラスやその他のものが関係しているため)、純粋に再帰ビューを使用します。今の問題は、それがどのように機能するかわかりません。最上位のカテゴリーから下がれば楽だが、逆に上がらなければならない(後ろ向き)。

私が持っているもの:

@model Domain.Category

@{
    ViewBag.Recursion = (int) ViewBag.Recursion + 1;
}

@if (Model.Parent != null)
{
    @Html.Partial("_RecursiveCategory", Model.Parent)
    <li>
        <ul class="categorylist">
            <li>@Html.ActionLink(Model.Name, "Index", "Categories", new {Model.Id, name = Model.FriendlyName}, null)</li>
        </ul>
    </li>
}
else
{
    <li>@Html.ActionLink(Model.Name, "Index", "Categories", new {Model.Id, name = Model.FriendlyName}, null)</li>
}

これは明らかに第 2 レベルまでは問題ありませんが、そこから先はすべて同じ列に並んでいます。

それで、これを解決する方法について誰かが良い解決策を考えることができますか? 繰り返しになりますが、文字列連結の大規模なハックはありませんか?

4

2 に答える 2

0

次のようなものを試してください:

private string GenerateUL(IQueryable<Menu> menus)
{
    var sb = new StringBuilder();

    sb.AppendLine("<ul>");
    foreach (var menu in menus)
    {
        if (menu.Menus.Any())
        {
            sb.AppendLine("<li>" + menu.Text);
            sb.Append(GenerateUL(menu.Menus.AsQueryable()));
            sb.AppendLine("</li>");
        } 
        else
            sb.AppendLine("<li>" + menu.Text + "</li>");
        }
    }
    sb.AppendLine("</ul>");

    return sb.ToString();
}

コントローラ

public ActionResult SomeAction()
{
    return View(GenerateUL(Category.Children));
}

意見

@model string

@{
    ViewBag.Recursion = (int) ViewBag.Recursion + 1;
}

@if (Model != null)
{
    @Html.Partial("_RecursiveCategory", Model.Parent)
    @Model
}
else
{
    <li>@Html.ActionLink(Model.Name, "Index", "Categories", new {Model.Id, name = Model.FriendlyName}, null)</li>
}
于 2013-02-11T14:19:32.863 に答える
0

作成された ul/li を微調整する必要があるかもしれませんが、次のViewとおりです。

@functions{


MvcHtmlString CreateTree(MvcApplication2.Models.Category  category)
{
    var swriter  = new StringWriter();
    var writer = new System.Xml.XmlTextWriter(swriter);

    CreateTree(category, writer);

    writer.Close();

    return new MvcHtmlString(swriter.ToString());
}

void CreateTree(MvcApplication2.Models.Category  category, System.Xml.XmlWriter outputWriter)
{
    if (category.Parent != null)
    {
        CreateTree(category.Parent, outputWriter);
    }

    // bubble up after recursion
    outputWriter.WriteStartElement("ul");
    outputWriter.WriteElementString("li", category.Title);
    outputWriter.WriteStartElement("li");
}  

}

    <div>

    @CreateTree(ViewBag.Category)


    </div>
于 2013-02-11T16:00:39.997 に答える