【问题标题】:ASP.Net MVC View and Controller file structureASP.Net MVC 视图和控制器文件结构
【发布时间】:2011-02-02 05:01:46
【问题描述】:

我很困惑必须在 MVC 1.0 项目结构中设置视图和相应的控制器。目前在默认应用程序中,我们在 Home 文件夹下有 About.aspx 页面,所有控制器操作都在 HomeController 中处理。这个控制器混合了 Home 动作和 About 动作。它使事情变得混乱。我喜欢清楚地分离我的控制器。喜欢分别拥有一个 About Controller 和 HomeCotroller。为此,我在视图文件夹下创建了另一个文件夹“About”并将 Aboput.aspx 放入其中,否则我们将收到以下错误。我怎样才能实现它?我喜欢在 View 中拥有与在 Cotroller 中一样的精确文件夹结构。

The view 'About' or its master could not be found. The following locations were searched:
~/Views/About/About.aspx
~/Views/About/About.ascx
~/Views/Shared/About.aspx
~/Views/Shared/About.ascx 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: The view 'About' or its master could not be found. The following locations were searched:
~/Views/About/About.aspx
~/Views/About/About.ascx
~/Views/Shared/About.aspx
~/Views/Shared/About.ascx

我喜欢有像 \iew\About.aspx 和 Cotroller\AboutController.cs 这样的文件夹 或 \View\Info\About.aspx 和 \Controller\Info\AboutController.cs。

这将使我的项目和代码放置得非常干净且易于维护。 在此先感谢您的帮助

【问题讨论】:

    标签: asp.net-mvc routing


    【解决方案1】:

    我想他们会希望你拥有

    视图/关于/Index.aspx

    /Views/AboutController Index() 将指向哪个

    路由示例:

    在 Global.asax 中:

    protected void Application_Start()
    {
        MyRoutes.RegisterRoutes(RouteTable.Routes);         
    }
    

    然后在 MyRoutes 类中:

    public class MyRoutes
    {
         internal static void RegisterRoutes(RouteCollection routes)
         {
             // add routes
         }
    }
    

    【讨论】:

    • 您总是可以添加一个将“/About.aspx”指向“/Views/Home/About.aspx”的路由
    • 是的,我可以这样做,但是如果是大型项目,我的 global.asx.cs 文件会很大。还有更好的选择吗?
    • 一旦你想出了你需要的所有模式,它还不错。此外,您不必将所有这些都放入 global.asax。我举了一个使用另一个类来注册你的路由的例子。
    【解决方案2】:

    您可能应该查看 ASP.Net MVC 框架的基本教程。它在几个约定下运行 - 最大的约定之一是文件命名和文件夹结构。

    虽然您喜欢的结构可能适合简单的项目或您的个人喜好,但它并不适合大型项目。您需要遵循约定,或者对框架有足够的了解,以便覆盖它的行为。

    【讨论】:

    • 实际上我正在考虑大型项目的观点。假设我有一个 Sales 文件夹,然后我在 sales 文件夹下有 10 个 .aspx 文件(One.aspx,Two.aspx...Ten.aspx)。这种情况下,我必须在 SalesController.cs 文件下实现所有控制器逻辑。试想一下,这是多么错误的做法?如果它提供了 OneController.cs、TwoController.cs 之类的选项,那么清晰的逻辑分离会更好。有解决这个问题的想法吗?
    • 这是一个非常非常糟糕的逻辑分离。您提出了一个约定,其中请求的视图文件指示控制器实例化,这与 MVC 的工作方式完全相反。
    • Womp,如果我同意你的观点,那么你是在告诉我将所有视图的控制器逻辑容纳在一个控制器文件中?如何说我的控制器正在创建视图?实际上,单个控制器正在创建多个视图(逻辑上相关但物理上分开,我可能不是一次,但我包含控制多个视图的代码)。我无法理解它是如何违反 MVC 框架概念的?在 MVC 发布之前,很多应用程序都是使用一对一的控制器和视图地图模式开发的。你能解释一下如何证明 MVC 模式的合理性吗?
    • 也许我误解了您的意图 - 听起来您希望将对视图文件 (One.aspx) 的请求路由到控制器 OneController.cs。 MVC 应该具有松散地基于您的实体的控制器,这些控制器将具有多个视图。虽然只要控制器控制视图,一对一映射就没有问题,但让视图控制控制器是向后的。
    • 我想我们现在在同一行。但是如何在 MVC1.0 中实现呢?要拥有这种类型的功能,我必须创建像 \View\One\One.aspx 这样的视图结构,并将 Controller 作为 \Controller\OneController.cs。还行吧。但我喜欢通过将控制器放置为 \Controller\Sales\OneController.cs 并查看为 \View\Sales\One.aspx 来实现上述功能。它将给出一个清晰的文件夹结构。为此,我认为我们需要更改一些配置。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多