代码之家  ›  专栏  ›  技术社区  ›  Simon_Weaver

如何在默认情况下为RC1中的ASP.NET-MVC视图获取“codebehind”文件

  •  5
  • Simon_Weaver  · 技术社区  · 16 年前

    在RC1中,用于创建视图的模板行为已更改。

    正如顾立伟关于 release candidate 默认情况下,新创建的ASPX视图不再具有代码隐藏文件。

    根据反馈,我们改变了 视图模板不具有 默认情况下,代码隐藏文件。这个 改变有助于强化 MVC应用程序中的视图 纯粹是为了渲染 不包含任何非渲染 相关代码),对大多数人来说 删除中未使用的文件 项目。

    RC构建现在添加了C和VB语法 支持继承视图模板 来自使用泛型的基类。 例如,下面我们将使用 使用edit.aspx视图模板_ 其_156;继承_157;属性派生 从视图页类型:

    我真的很喜欢在代码隐藏中编写特定于视图的代码来输出视图——特别是当我在页面的几个部分重复逻辑时,我不能证明创建局部视图是正确的。

    我的实际问题: 史葛说 默认情况下 -这意味着我可以改变这种行为,但我似乎看不到在哪里。有可能吗?手工创建一个代码隐藏文件,改变周围的事情是一件痛苦的事情。

    这也会导致另一个问题:

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

    附录: 对于那些想知道为什么我想要一个代码隐藏在这里的人来说,这是一些可能的原因。这是一个关于我所有想法的累积列表。不用说(应该是这样),除了模型中已经存在的数据之外,您不能访问任何其他数据。对于模型数据的简单操作,LINQ是可以的,但是LINQ到SQL则不行!MVC是为那些应该已经知道这一点的人设计的——这就是为什么我喜欢它——是由聪明人为聪明人设计的。

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

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

    视图的代码隐藏是很好的。

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

    6 回复  |  直到 16 年前
        1
  •  2
  •   Andrew Stanton-Nurse    16 年前

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

    然而,这个场景的“MVC方法”可能是在一个单独的类中创建一个自定义助手。

    我最近写了一个使用Gravatar的网络应用程序( http://www.gravatar.com )为了生成配置文件图片,我在视图中不断地编写相同的自定义标签,因此我创建了一个助手:html.gravatar()。

    只需创建一个静态类“myhelpers”或“gravatorhelpers”或“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等。

        2
  •  2
  •   Community CDub    8 年前

    这似乎不是个好主意。我读过的每一篇评论都说“不要使用后面的代码,我们希望它不在那里”。我同意。您可以尝试在扩展方法中编写逻辑(传统上 HtmlHelper 喜欢 here .

        3
  •  1
  •   Mr Bell    16 年前

    我认为文件背后的代码仍然是一件有用的事情。虽然许多人谈论他们是如何的糟糕,因为他们提供了一种方法来打破MVC所追求的设计模式,但他们并不是天生这样做的。您可以说视图应该是愚蠢的,但我认为更准确的说法是,视图不应该涉及复杂的业务逻辑。但是,它确实需要自己关注展示的各个方面。因此,仍然有一些元素需要提供需要简单HTML以外的代码的信息。它遵循了标记本身与标记相关的关注点分离(更不用说视图的纯粹可读性)的推理,在需要代码的情况下,标记背后支持代码。

    路易斯·阿布鲁写了一篇关于这个问题的好文章。

    Codebehind files in asp.net mvc are not evil

        4
  •  1
  •   Peter    15 年前

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

        5
  •  0
  •   Pablote    16 年前

    我还想让代码落后于默认值,但是找不到更改它的方法。此页面说明如何向页面添加代码隐藏: http://msdn.microsoft.com/en-us/magazine/cc301556.aspx .

    在我看来,代码隐藏类是数据绑定控件的理想选择,并在必要时对数据进行一些小的更改(例如日期和货币格式)。此外,中继器是目前显示数据列表最简单的方法,我仍然找不到一种方法来迭代匿名类型集合,而且在页面中只有for语句会提醒我php:s

        6
  •  0
  •   Community CDub    8 年前

    我回答了这个问题 here :

    如何向部分视图添加代码隐藏页

    似乎这不是特别棘手,而且非常能干 此答案适用于部分“viewUserControl”,但同样适用。

    好啊。

    首先:添加一个具有.cs约定的类文件(即view.ascx.cs)

    第二:将“using system.web.mvc;”添加到类中

    第三:将类更改为从“viewUserControl”继承

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

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

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

    注意:要使用普通MVC视图,只需从“viewpage”继承类即可。