Я использую приведенный ниже код в качестве HTMLHelper, который получает данные из базы данных и перебирает их, чтобы отобразить меню. Это довольно просто, как вы можете видеть, однако, что если у вас есть таблица базы данных, использующая смежную модель иерархий, например / ID, ParentID, OrderID. Легко увидеть, что происходит, но для правильного вывода этих данных необходима рекурсия. Допустимо ли написание рекурсивной функции C #? Если так, может кто-нибудь помочь мне с этим? Ожидаемый результат примерно такой ...
<ul>
<li>Item1
<ul>
<li>SubItem1</li>
</ul>
</li>
</ul>
SQL 2008 теперь имеет тип данных Hierarchy, поэтому я не уверен, поможет ли это?
Мне также хотелось бы, чтобы пользователи могли сами решать, что происходит в меню, например, список элементов, которые можно открыть в меню, а затем выбирать эти элементы и их позиции в иерархии. При нажатии на сохраненную кнопку эта иерархия сохраняется в базе данных.
Я слишком много спрашиваю, я уверен, что это довольно распространенный сценарий?
Вот мой код HTMLHelper, если кто-то хочет его использовать ...
public static string Menu(this HtmlHelper helper, int MenuCat)
{
string menuHTML = "<ul id=\"menu\">";
var route = helper.ViewContext.RequestContext.RouteData;
string currentPageName = route.GetRequiredString("id");
DB db = DB.CreateDB();
//var result = from p in db.WebPages where p.CategoryID == 9 select p;
var result = from p in db.WebPages select p;
foreach (var item in result)
{
if (item.Name == currentPageName)
{
menuHTML += "\n\t<li>" + helper.ActionLink(item.Name, "Details", "Dinner", new { id = item.ID }, new { @class = "selected" }) + "</li>";
}
else
{
menuHTML += "\n\t<li>" + helper.ActionLink(item.Name, "Details", "Dinner", new { id = item.ID }, null) + "</li>";
}
}
menuHTML += "\n</ul>\n";
return menuHTML;
}