Справка по модели данных для asp.net MVC - PullRequest
0 голосов
/ 21 марта 2012

Я новичок в MVC и решил использовать его для моего нового проекта. Мне было поручено перестроить домашнюю страницу интрасети для моей компании, которая фактически представляет собой набор ссылок и вложенных ссылок в столбцах.

Пример:

  • Руководитель
    • Ссылка 1
    • Ссылка 2
  • Ссылка 3
  • Ссылка 4
    • Ссылка 5

Суть в том, что они хотят, чтобы эти ссылки приходили из базы данных, которой будут управлять (добавлять, редактировать, упорядочивать, удалять) со страницы / admin. Так как это домашняя страница, я хотел бы сделать как можно меньше вызовов БД, но это не обязательно.

Я создал таблицу базы данных и обнаружил, что в MVC было трудно (хотя я и получил это), итеративно проходить по ней и отображать ее на странице без большого количества кода на странице просмотра, я подумал, что это не цель / Лучшая практика MVC, и я должен делать что-то не так с моей моделью.

Вот моя структура таблицы с примерами записей:

ID|  Text     | Href       | OrderId | NewWindow | ParentId
1 |  Head     | NULL       |    1    |    0      |   NULL
2 | Link 1    | link1.htm  |    1    |    1      |    1
3 | Link 2    | link2.htm  |    2    |    1      |    1
4 | Link 3    | link3.htm  |    2    |    1      |   NULL
5 | Link 4    | link4.htm  |    3    |    1      |   NULL
6 | Link 5    | link5.htm  |    1    |    1      |    5

В значительной степени я делал этот очень грязный цикл foreach, который возвращал всю таблицу, и я определял «заголовки (родительские) ссылки» и соответственно обрабатывал HTML. Это действительно напомнило мне о классических днях жереха.

Я надеюсь, что что-то связано с моделью и работает с меньшими наборами данных.

Есть ли у вас какие-либо советы / предложения / комментарии о том, как я должен справиться с этим?

Ответы [ 2 ]

0 голосов
/ 02 апреля 2012

Как вы говорите, по вашему мнению, лучше избегать такой сложной логики. Насколько это возможно, вы должны передать вашему виду простые данные для отображения. Скорее всего, у вас всегда будут какие-то операторы if и foreach, но что-то более сложное, чем вы хотите избежать в значительной степени.

Лучше иметь доступ к данным и сборку ваших объектов в методе действия в вашем контроллере, а не в представлении, и обычно тогда даже эти операции могут быть переданы какой-либо другой службе (например, вызову репозиторий, вызов картографа.) В общем, вам также лучше передавать ViewModel объекты на ваш взгляд, а не объекты прямо из вашего домена. (Хотя в этом случае, поскольку объекты всегда предназначены для отображения в любом случае, вы, вероятно, не слишком беспокоитесь об этом.)

Вы можете поместить все эти вещи в метод действия на вашем HomeController, если эти ссылки относятся только к домашней странице, или если это общесайтовое меню, у вас может быть отдельный NavController, чтобы специально работать с ним.

1010 *, например *

public class NavController : Controller
{
    // ...

    [ChildActionOnly]
    public PartialViewResult SiteMenu(string currentPage)
    {
        // Get your flat list of menu items from the DB
        var menuItems = _siteMapRepo.GetMenuItems();

        // Map them into something more tree-like...
        var treeMenu = MapFlatItemsToTreeMenu(menuItems);

        return View("_Menu", treeMenu);
    }

    // ...
}

Тогда у вас может быть частичное представление, которое отображает их, например, _Menu.cshtml.

Тогда где-нибудь в родительском представлении, скорее всего, в макете вашего сайта, вы можете вызвать RenderAction для вызова меню:

@{Html.RenderAction("SiteMap", "Nav");}

Код в _Menu.cshtml может стать интересным, поскольку вы имеете дело с древовидной структурой. У вас могут быть рекурсивные вызовы в вашем частичном представлении, с нижним расположением на конечных узлах, предпочтительно с использованием RenderPartial, а не RenderAction на этом этапе, поскольку RenderAction приводит к новому запросу. Что-то вроде ...

@model MenuItem

@if (Model.HasChildren)
{
    <ul>
    @foreach (var child in Model.Children)
    {
        @{Html.RenderPartial("_Menu", child);}
    }
    </ul>
}
else
{
    <li>
       // do something with Model.Url etc.
    </li>
}

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: На самом деле я не пробовал это, просто выписал, но это должно дать суть, я надеюсь.

Вы также можете, конечно, посмотреть, если кто-то другой уже сделал что-то подобное, что вы можете использовать, например, MvcSiteMapProvider или MvcTreeView .

0 голосов
/ 21 марта 2012

Я сделал то же самое в моем проекте.Если эти данные предназначены только для карты сайта, строки базы данных слишком восприимчивы для этого.

Я использовал файл XML (также можно сохранить в базе данных как одно поле), чтобы сохранить карту сайта, и пока он работает нормально.

Хорошая вещь для этого - его можно легко связать с иерархическими виджетами: деревом или ул.И его легко кэшировать, потому что он редко изменяется.Информация о ссылке и тексте может храниться в атрибутах xml.

...