【问题标题】:How should I structure my mvc 3 app in this situation?在这种情况下,我应该如何构建我的 mvc 3 应用程序?
【发布时间】:2012-03-21 11:56:17
【问题描述】:

我正在尝试使用 mvc 制作一个简单的网站,但我对如何构建所有内容有点困惑。这类事情有什么指导方针吗?

我遇到的困难是知道如何处理大量嵌套页面,以及如何使用 ViewModel,或者更确切地说 何时

我之前在 MVC 中构建了一个站点,但它非常简单:总共只有大约 5 个页面,因此构建起来并不困难。在我目前的情况下,我正在尝试构建一个包含许多嵌套页面的站点,我想知道我如何构建它。

例如,如果我有这样的结构:

                                        Home
                                          |
                        About -------- Contact---------- Products
                          |
                          |
           The Board -- What we do
             |
             |
 person1 -- person2 -- person3

我应该如何设置我的网站结构?

我的直觉是我应该有一个 AboutController、一个 ContactController 和一个 ProductsController。然后我会在 AboutController 中有两个 ActionResults,分别称为“TheBoard”和“WhatWeDo”,但是如何处理“TheBoard”的嵌套页面?如果我在它下面嵌套了更多页面怎么办?我会嵌套控制器吗?

另外,即使这个虚拟网站不需要它,如果我想共享 ViewModel 怎么办?我假设 ViewModel 可以跨页面共享(假设需要相同的功能)。或者这是不好的做法?是否应该为每个页面创建一个新的 ViewModel?

抱歉,如果我没有很好地解释这一点。基本上,我正在寻找有关如何构建包含大量页面的 MVC 3 Web 应用程序的任何资源。有什么基本的原则需要遵守吗?我遵循了 asp.net 网站上的大部分教程,但实际上并没有任何关于最佳实践的指南。

有什么想法吗?

谢谢

编辑:澄清一下,如果我使用 webforms 构建这个站点,我可能会有一个 default.aspx 页面,其中包含 About、Contact、Products 文件夹和任何嵌套的页面/文件夹。我想我正试图弄清楚我将如何在 MVC 中做到这一点?

【问题讨论】:

  • 您对您正在尝试构建的网站的描述根本不清楚。您应该描述每个页面所需的功能。没有关于如何构建应用程序的指南,因为没有单一的方法可以做到这一点。根据您尝试执行的操作,可能会有不同的方法。
  • 好吧,在这种情况下,除了返回视图之外,确实不需要任何功能。我明白你在说什么,但必须有一些关于如何构建它的简单指南?

标签: asp.net .net asp.net-mvc-3 coding-style


【解决方案1】:

我同意 Darin 的观点,即您需要描述网站的功能。如果您要做的只是管理内容,那么最好使用像 Orchard 这样的开箱即用的 CMS。您可以使用这样的 CMS 来创建链接页面的任意结构。

您的评论“但如果我想更进一步呢?”在我看来,这个项目的要求还不清楚。您可以随时扩展和重构。现在,只需实现客户设定的要求即可。

首先,在将注意力转向“正确构建”之前,请确保您“构建正确”。

回复 cmets

听起来您很担心导航和 URL 结构。在 MVC 中,您的 URL 结构可以完全独立于您的控制器组织。 MVC 中没有“控件”的概念。有 HTML 助手,但没有服务器控件的 webforms 意义上的控件。

例如,如果您想要 /board/members/jim/bio/resume/company1/edit,这是完全可能的。 ResumeCompanyEdit 操作在哪个控制器中并不重要,因为您可以定义自定义路由以将您想要的 URL 链接到此操作。

至于面包屑,您可以手动创建它们,或编写自定义 HtmlHelper 以根据您的自定义 URL 架构为您呈现面包屑。

【讨论】:

  • 明确一点,我实际上并没有被要求开发这个网站。我只是想了解您如何处理 MVC 中的嵌套页面,因为据我所知,您不能在控制器中嵌套控制器吗?以面包屑控件为例。您到底会如何在 MVC 应用程序中使用其中之一?
【解决方案2】:

我会有你提到的 AboutController、ContactController、ProductController

AboutController 可以有一个 Action Person。

在global.asax中设置路由如下:

        routes.MapRoute(
            "AboutPerson", // Route name
            "about/board/{personName}", // URL with parameters
            new { controller = "About", action = "Person"} 
        );

Person 操作应如下所示:

    public ActionResult Person(string personName) {
         // Code to get person data from DB - if required
         var person = db.GetPerson(personName);
         return View(person);
}

如果页面是静态的,只需有不同的视图并检查 personName 并返回相关视图:例如

return View("BoardMember1");

其中 BoardMember1.cshtml / aspx 是 Views/About 目录中的一个 View

【讨论】:

  • 完美,有道理。但是如果我想更进一步呢?
  • 当你说更进一步时,你是指在董事会成员下面工作的人吗?如果是这样,可能有另一条路线“about/employee/{employeeName} 指向另一个动作 Employee(string employeeName) 使用 about/board/ 路线会令人困惑,因为他们在技术上不是董事会成员
  • 啊哈,我想我理解你了。所以基本上不可能以树状结构来构造你的代码?你只需要在前端假装它?
  • 不,MVC 不像普通的基于目录的网站。路径是虚拟的 /about/board/boardmember 并不存在。它只是指向一个控制器和动作。目录的感知是由路由提供的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 2012-12-16
相关资源
最近更新 更多