【问题标题】:Data model help for asp.net MVCasp.net MVC 的数据模型帮助
【发布时间】:2012-04-05 12:20:35
【问题描述】:

我是 MVC 的新手,并决定将它用于我的最新项目。我的任务是为我的公司重新设计 Intranet 主页,这实际上是一堆链接和列中的子链接。

示例:

  • 头部
    • 链接 1
    • 链接 2
  • 链接 3
  • 链接 4
    • 链接 5

关键是他们希望这些链接来自一个数据库,该数据库将从 /admin 页面进行管理(添加、编辑、排序、删除)。由于它是主页,我希望尽可能少地调用 db,但不必如此。

我创建了一个 db 表,发现在 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。它真的让我想起了经典的 asp 时代。

我希望与模型有关并使用较小的数据集。

您对我应该如何处理这个问题有任何提示/建议/cmets?

【问题讨论】:

    标签: xml asp.net-mvc datamodel


    【解决方案1】:

    正如你所说,在你的观点中最好避免这种复杂的逻辑。尽可能地,您应该将您的视图传递给显示的简单数据。您可能总是有一些 ifforeach 语句,但任何比您想要避免的更复杂的语句。

    最好在控制器中的操作方法中进行数据访问和对象的组装,而不是在视图中,通常甚至这些操作也可能被外包给其他一些服务(例如,调用存储库,对映射器的调用。)通常,您最好将 ViewModel 对象传递给您的视图,而不是直接来自您的域的对象。 (尽管在这种情况下,由于对象总是用于显示目的,您可能不必担心太多。)

    如果这些链接特定于主页,或者如果它是站点范围的菜单,您可以将所有这些内容放在 HomeController 上的操作方法中,您可以使用单独的 NavController 来专门处理它。

    例如

    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>
    }
    

    免责声明:我实际上并没有尝试过,只是把它写出来,但它应该给出了我希望的要点。

    您当然也可以查看其他人是否已经滚动了类似的东西并且您可以使用,例如MvcSiteMapProviderMvcTreeView

    【讨论】:

    【解决方案2】:

    我在我的项目中做了同样的事情。如果此数据仅用于站点地图,则 db rows 对它来说太过分了。

    我使用了一个 xml 文件(也可以作为单个字段存储在 db 中)来保存站点地图,到目前为止它工作正常。

    这样做的好处是它可以很容易地绑定到分层小部件:树或 ul。并且易于缓存,因为它很少被修改。 链接和文本信息可以存储在 xml 属性中。

    【讨论】:

    • 你为此使用了 ASP.NET MVC?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多