5

在 RC1 中,用于创建视图的模板的行为发生了变化。

正如 Scott Gu 关于发布候选版本的帖子所解释的那样,默认情况下,新创建的 aspx 视图不再具有代码隐藏文件。

根据反馈,我们已将视图模板更改为默认没有代码隐藏文件。此更改有助于加强 MVC 应用程序中视图的用途(旨在纯粹用于渲染并且不包含任何非渲染相关代码),并且对于大多数人来说消除了项目中未使用的文件。

RC 版本现在添加了 C# 和 VB 语法支持,用于从使用泛型的基类继承视图模板。例如,下面我们将其与 Edit.aspx 视图模板一起使用——其“inherits”属性派生自 ViewPage 类型:

我真的很喜欢能够在代码隐藏中编写特定于视图的代码来输出视图 - 特别是如果我在页面的几个部分重复逻辑,我无法证明创建部分视图是合理的。

我的实际问题:斯科特默认说- 这意味着我可以改变这种行为,但我似乎看不到在哪里。是否可以?手动创建一个代码隐藏文件并改变周围的东西是一种痛苦。

这也会导致另一个问题:

  • 如果我重构模型的名称,则视图中的指令不会更新。这不是世界末日,而是完全强类型化的一个明显优势。

附录:对于那些想知道为什么我想要代码隐藏的人,这里有一些可能的原因。这是我所想到的几乎所有内容的累积列表。不言而喻(应该如此),除了模型中已有的数据之外,您不得访问任何数据。LINQ 可以用于模型数据的简单操作,但 LINQ to SQL 则不行!MVC 适用于应该已经知道这一点的人——这就是我喜欢它的原因——由聪明的人为聪明的人制作。

  • 数据绑定旧版 ASP.NET 控件 - 如果替代方案不可用或需要临时解决方案。
  • 查看需要递归以创建某种嵌套或分层 HTML 的逻辑。
  • 查看使用临时变量的逻辑。我拒绝在我的标签汤中定义局部变量!我至少希望它们作为视图类的属性。
  • 仅特定于一个视图或模型且不属于 HtmlHelper 的逻辑。作为旁注,我认为 HtmlHelper 不应该知道任何“模型”类。IEnumerable<Product>如果它知道模型中定义的类(例如ProductModel.
  • 当您键入时,HtmlHelper 方法最终会从您的所有视图中可见Html+dot,我真的想尽可能地最小化这个列表。
  • 如果我想编写代码,使用HtmlGenericControl该命名空间中的其他类以面向对象的方式生成我的 HTML(或者我有执行我想要移植的现有代码)。
  • 如果我打算将来使用不同的视图引擎怎么办。我可能希望将一些逻辑保留在标签汤之外,以便以后更容易重用。
  • 如果我希望能够重命名我的模型类并让它自动重构我的视图,而无需转到 view.aspx 并更改类名,该怎么办?
  • 如果我正在与一个我不信任的 HTML 设计师协调,他不会弄乱“标签汤”,并且想要在 .aspx.cs 文件中编写除非常基本的循环之外的任何内容。

我认为人们对“代码隐藏”有偏见,因为它传统上被解释为“事件处理代码”,而不是“视图部分类的另一半”。

视图的代码隐藏很好。

我并不反对它会使文件夹结构有些混乱,但这就是+图标的用途。我只希望能够使用“添加视图”创建带有代码隐藏的视图。

4

6 回答 6

2

要直接回答您的问题,我认为您无法更改此默认设置。您可以尝试修改模板(在 %programfiles%\Microsoft Visual Studio 9.0\Common7\IDE\ItemTemplates" 中的某个位置),但我不确定。

但是,这种场景的“MVC 方式”可能是在一个单独的类中创建一个自定义帮助器。

我最近编写了一个使用 Gravatar ( http://www.gravatar.com ) 生成个人资料图片的网络应用程序,并且我一直在我的视图中编写相同的自定义 <img> 标签,因此我创建了一个帮助程序:Html.Gravatar( )

只需创建一个静态类“MyHelpers”或“GravatarHelpers”或“FooHelpers”并添加带有如下签名的静态扩展方法:

public static string Gravatar(this HtmlHelper htmlHelper, string emailAddress) {
    return htmlHelper.Image(...);
}

或者,如果您使用强类型视图 (ViewPage<T>) 并希望利用它,您可以扩展 HtmlHelper<T>

public static string Foo<TModel>(this HtmlHelper<TModel> htmlHelper, ...) {
    // Do stuff
    return // Stuff
}

您可以轻松地将 HtmlHelper 切换为 UrlHelper 或 AjaxHelper。我相信您还可以从助手上的 ViewContext 属性访问 ViewData 等。

于 2009-01-28T22:46:31.470 回答
2

这似乎真的不是一个好主意。我读过的每条评论都说“不要使用代码隐藏;我们希望它不存在”。并且我同意。HtmlHelper您可以尝试在扩展方法(传统上是 on )中编写逻辑,例如此处

于 2009-01-28T22:50:40.243 回答
1

我认为文件背后的代码仍然是有用的东西。尽管许多人谈论它们有多糟糕,因为它们提供了一种打破 MVC 所追求的设计模式的方法,但它们并不是天生就这样做的。您可以说视图应该是愚蠢的,但我认为说视图不应该关注复杂的业务逻辑可能更准确。然而,它确实需要关注呈现的各个方面。因此,除了简单的 html 之外,仍然存在需要代码来呈现信息的元素。它遵循关注点分离的推理(更不用说视图的纯可读性),标记本身与标记相关,并且在需要代码的地方支持它的代码。

Luis Abreu 写了一篇关于这个主题的好文章

asp.net mvc 中的代码隐藏文件并不邪恶

于 2009-06-12T19:17:31.357 回答
1

仅供参考 - 在 Visual Studio 2010 中,只需将适当命名的代码文件添加到包含视图的文件中,就会自动将新的代码隐藏文件与视图相关联。您无需删除并重新添加文件即可将它们链接起来。但是,您仍然需要更改继承的类以使其像@Harry 描述的那样工作。

于 2010-10-04T18:10:11.573 回答
0

我还希望将代码隐藏作为默认设置,但找不到更改它的方法。此页面说明如何将代码隐藏添加到页面:http: //msdn.microsoft.com/en-us/magazine/cc301556.aspx

在我看来,代码隐藏类是数据绑定控件的理想选择,并在必要时对数据进行一些小的更改(例如日期和货币格式)。到目前为止,Repeaters 是显示数据列表的最简单方法,我仍然找不到遍历匿名类型集合的方法,并且页面中只有一个 for 语句让我想起 PHP:S

于 2009-01-30T21:12:56.907 回答
0

我在这里回答了这个问题:

如何将代码隐藏页面添加到部分视图

似乎这并不是特别棘手,而且非常可行这个答案适用于部分“ViewUserControl”,但同样适用

行。

第一:添加一个带有.cs约定的Class文件(即view.ascx.cs)

第二:添加“使用System.Web.Mvc;” 到班级

第三:将类更改为从“ViewUserControl<>”继承

第四:将以下内容添加到视图的标题中:

CodeBehind="View.ascx.cs" Inherits="Project.Views.Shared.View"

第五:将文件复制出解决方案并拖回以将两者重新关联在一起

注意:要使用普通 MVC 视图,您只需要从“ViewPage”继承类

于 2009-03-25T07:06:57.693 回答