在MVC中,Asp.net页面是否应该有codebehind文件?

4
我的Web应用程序采用Asp.Net MVC模式。没有.aspx页面有代码后置文件。我被告知,由于应用程序遵循MVC模式,.aspx页面没有codebehind文件。所有的C#编码都是内联完成的。
我的问题是,如果我们遵循MVC模式,难道就不应该为.aspx页面拥有代码后置文件吗?我没有看到这些.aspx页面和传统的ASP页面之间有任何区别,在利用Asp.Net并维护代码/ HTML方面,我们难道不应该为每个.aspx页面拥有一个代码后置文件吗?
如果有人能清楚地解释一下,那就太好了。
提前致谢。
4个回答

5

Asp.net MVC不使用代码后置,这是正确的。但是。你不应该把你的页面看成传统的ASP页面,因为它们并不是。大部分处理(如在codebehind中实现)都是在控制器操作内完成的。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
@Derin:你是说你的Asp.net WebForms应用程序包含将大部分C#代码封装在ASPX文件中吗?如果是这样,那么不行。控制器操作不能成为视图文件的一部分。控制器是单独的类。我从未尝试在视图中定义它们,但我想这应该不起作用,因为视图通常不是预编译的,因此控制器类将不可用。 - Robert Koritnik

2

所有的.aspx页面都没有代码后台文件

这就是应该的。在WebForms中,传统的代码后台需要订阅页面生命周期的不同事件,但在MVC中,这个任务由控制器完成。你的.aspx页面当然可以包含一些内联服务器端代码,以便使用HTML和Url助手,例如TextBoxFor、EditorFor、ActionLink等。但这就是你应该限制视图的范围。

以Razor为例,它甚至不存在代码后台的概念。因此,即使在WebForms视图引擎中仍然可以有代码后台,这是因为它是经典ASP.NET WebForms的遗留产物,不能在MVC中使用。


如何维护.aspx页面中的HTML和代码?我的项目经常进行UI更新以及添加/修改新功能。由于HTML和内联代码都是紧密耦合的,因此进行修改很困难。在这种情况下,我们应该选择MVC吗? - Derin
@Derin,我不明白这有什么问题。如果你不喜欢WebForms的标签混乱,你可以选择Razor视图引擎,它在我看来语法更清晰、更易于理解。 - Darin Dimitrov

0

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


0

视图文件不应该有代码后台文件(无论是WebForms ViewEngine还是Razor ViewEngine)。MVC的本质是您不应该在视图中有任何逻辑,它们应该在大部分情况下都是愚蠢的。最多可以使用循环(许多人使用编辑器模板来避免循环)和条件语句有条件地呈现HTML。因此,当您的视图中没有逻辑时,根本不需要代码后台。当控制视图时,模型中的每个内容都应该被设置。如果您认为有视图特定的逻辑


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接