【问题标题】:Should Asp.net pages have codebehind files in MVCAsp.net 页面是否应该在 MVC 中有代码隐藏文件
【发布时间】:2011-10-01 03:43:21
【问题描述】:

我的 Web 应用程序是一个 Asp.Net MVC 模式。所有 .aspx 页面都没有代码隐藏文件。有人告诉我,由于应用程序遵循 MVC 模式,.aspx 页面没有代码隐藏文件。所有的 C# 编码都是内联完成的。

我的问题是,如果我们遵循 MVC 模式,我们是否不应该为 .aspx 页面提供代码隐藏文件。我看不出这些 .aspx 页面与我们进行内联编码的传统 ASP 页面之间有任何区别。为了利用 Asp.Net 和维护代码/html,我们不应该为每个 .aspx 页面都有一个代码隐藏文件吗?

如果有人能清楚地解释这一点,那就太好了。

提前致谢。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    Asp.net MVC 不使用代码隐藏,这是真的。但是。您不应该将您的页面视为传统的 ASP 页面,因为它们不是。大多数处理(如代码隐藏)是在控制器操作中完成的。 ASPX 页面几乎不显示该处理的结果(当操作结果为 ViewResultPartialViewResult 时)。

    因此我们可以说控制器操作“”许多 ASPX 文件的代码隐藏。

    这当然是一个非常广泛的简化,但你可以这样理解。

    补充说明

    您可能会争辩说,在 ASPX 文件中编写 C# 代码与编写 ASP 代码非常相似,但让我让您考虑一下。每当您添加时在 Asp.net WebForms 中

    <asp:Repeater ... />
    

    你所做的基本上是一个不同形式的foreach 语句,具有一些额外的功能。在 Asp.net MVC 中,您编写的是实际的 foreach 语句,而不是您想要的任何附加功能。大多数情况下,您只会渲染项目而没有其他功能,因此 foreach 将是:

    1. 比丰富的服务器端控件更快
    2. 更简单,因为为每个项目呈现的 HTML 将大约为。与中继器项目的模板相同
    3. 更少的资源消耗,因为它只是一种简单的语言结构,而不是一些必须实例化、执行和保存(如状态)的服务器端控件

    为什么一个控制器动作可以成为许多 ASPX 的代码隐藏?

    因为我们可以有这样的代码

    public ActionResult Index()
    {
        var data = /* get some data */
        if (data.Count > 0)
        {
            /* first ASPX */
            return View("DisplayItems", data);
        }
        else
        {
            /* second ASPX */
            result View("DisplayEmpty");
        }
    }
    

    更不用说这段代码所做的事情比一些复杂的页面生命周期处理要简单得多,这些处理需要同时处理这两种状态,这会导致包含所有 HTML 的更复杂的 ASPX 文件。

    在 Asp.net 中,MVC 代码非常简单/基本,因为它只做它需要做的事情,而视图也更简单,因为每个视图可能只服务于一个状态/情况/目的。没有 Asp.net WebForms 中的多面处理。

    【讨论】:

    • 如何维护 .aspx 页面中的 html 和代码。我的项目经历了频繁的 UI 以及新功能的添加/修改。由于 Html 和内联代码都捆绑在一起,因此很难进行修改。在这种情况下,我们应该选择 MVC 吗?
    • @Derin:您是说您的 Asp.net WebForms 应用程序包含封装了大部分 C# 代码的 ASPX 文件吗?如果是这样的话,那么没有。控制器动作不能是视图文件的一部分。控制器是单独的类。我从未尝试在视图中定义它们,但我猜它不应该工作,因为视图通常没有预编译,因此控制器类不可用。
    【解决方案2】:

    任何视图都不应该有代码隐藏文件(无论是 webforms viewengine 还是 razor viewengine)。 mvc 的本质是视图中永远不应该有任何逻辑,并且它们在大多数情况下应该是愚蠢的。最多可以使用循环(许多人使用编辑器模板来避免循环)和条件语句来有条件地呈现 HTML。因此,当您在视图中没有逻辑时,根本不需要代码。模型中的每一件事都应该在控制视图时设置。如果你觉得有视图具体的逻辑

    【讨论】:

      【解决方案3】:

      所有 .aspx 页面都没有代码隐藏文件

      应该是这样的。在 WebForms 中订阅页面生命周期的不同事件的传统代码不再应该在 MVC 中完成。该任务由控制器完成。您的 .aspx 页面当然可以包含一些内联的服务器端代码,以便使用 HTML 和 Url 帮助程序,例如 TextBoxFor、EditorFor、ActionLink ......但是您应该将视图限制在这些地方。

      让我们以另一个视图引擎为例,例如 Razor。甚至不存在代码背后的概念。因此,您仍然可以在 WebForms 视图引擎中保留代码这一事实是因为它是经典 ASP.NET WebForms 的遗留遗产,不能在 MVC 中使用。

      【讨论】:

      • 如何维护 .aspx 页面中的 html 和代码。我的项目经历了频繁的 UI 以及新功能的添加/修改。由于 Html 和内联代码都捆绑在一起,因此很难进行修改。在这种情况下,我们应该选择 MVC 吗?
      • @Derin,我不明白这是什么问题。如果你不喜欢 WebForms 的标签汤,你总是可以选择 Razor 视图引擎,恕我直言,它更干净,更容易理解语法。
      【解决方案4】:

      MVC 中没有代码隐藏。 MVC 只是将 aspx 用作模板引擎(可能是为了快速发布,因为他们现在正在转向 Razor 作为他们首选的模板引擎)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多