【问题标题】:ASP.NET MVC Generic User ControlASP.NET MVC 通用用户控件
【发布时间】:2013-03-20 19:21:04
【问题描述】:

我在原版 ASP.NET 中创建了一个通用用户控件:

  • 通过一个 set 属性,它从页面 A 或 B 或它碰巧存在的任何父页面中获取一堆元数据。

  • 有时此用户控件有多个副本,当然每个副本都在一个页面上处理不同的元数据。

  • 在用户控件的代码隐藏中,根据其元数据,根据需要动态呈现子元素。

我现在正在研究 ASP.NET MVC。今天是此类活动的第一天,我不知道如何移植此用户控件的通用性。页面是否与控制器是一对一的关系?用户控件呢?我的通用用户控件会直接链接到一个或多个控制器吗?如果是这样,这个链接是如何分配的?还是每个控制器都只是将视图数据传递给用户控件?

谁能给我关于我的场景的高级设计想法?或者指向我有用的链接?

【问题讨论】:

    标签: asp.net-mvc generics controls


    【解决方案1】:

    天哪……

    Asp.Net mvc 的概念也与 RESTful 风格的网站结构密不可分。我不会再费心解释MVC了,因为有很多很棒的文章比如http://weblogs.asp.net/scottgu/archive/2007/11/13/asp-net-mvc-framework-part-1.aspx

    至于用户控制,整个概念是您不应该在所有页面上重复并提供相同的功能。相反,您将创建一个局部视图,并将该局部视图 POST 数据发送到特定的 url。

    然后,页面上有多个表单元素,它们都发布到特定的 URL,每个都为页面的该部分提供功能。

    例如一个登录框 -> 一个带有登录名/密码输入的表单元素,发布到 /Account/Login

    一个注册箱 -> 一个带有名称/电子邮件/密码输入的表单元素,发布到 /Account/Register

    等等等等

    你真的需要放弃你在 WebForm 中学到的很多东西才能开始使用 MVC。

    编辑- 我相信学习 MVC 的最佳方法是通过一个小项目进入那里并开始。也是一个忠告。 Asp.Net mvc 有很多你想要遵循的“约定”。

    例如。 /home/index 的默认页面。默认页面是 /index。文件夹命名结构。

    当然你可以改变所有这些,但你通常只是在浪费时间。

    【讨论】:

    • 谢谢。关于我所描述的功能,您能否扩展 MVC 的优势?我很难看到 MVC 将如何改进我的通用用户控件在 vanilla ASP.NET 中已经做得相当好的大图。
    • 哈哈,没有。 MVC 在打包用户控件方面确实有缺点。 MVC 的整个思想是将视图与模型与控制器分离。所以理论上你不能把它们打包在一起。
    • 我建议您先了解 MVC 的基础知识。有很多方法可以实现你所追求的,但它非常复杂。现在,如果您想要像用户控件这样的模块化,我建议您使用 WebForms。也许可以查找其中一个 MVVM 框架以在 WebForm 上使用,以获得更好、更一致的关注点分离。
    【解决方案2】:

    其实只是为了给你指明一个方向,你可以看看以下:

    通过自定义视图引擎从序列化源(如 sql/resource 嵌入字符串)加载视图。

    或自定义 Html 帮助程序扩展方法。

    这两个中的一个和

    自定义控制器工厂/激活器(在 MVC 网站之外或在引用的 bin 文件中提供控制器 + 操作)

    一种将事件挂钩到自定义用户控件的方法。我首先想到的是依赖注入。 (将服务注入到您打包为序列化局部视图的控制器的控制器操作中)

    因此,为了使用“精细、自包含”的用户控件,您将需要这些基础设施,并以特殊方式封装控件。

    或者您可以在 MVC 中使用普通的旧用户控件。我认为可行(谷歌搜索)

    【讨论】:

    • 当您更熟悉 MVC 时,这些就是:P。如果您刚刚开始,则无需进入这些内容。
    【解决方案3】:

    几个想法让你滚动。希望这会有所帮助。

    • 在考虑 MVC 时,将“视图”视为没有背后代码的传统“页面”。 “视图”具有控件和 HTML 以及其他渲染特定逻辑。

    • 后面的传统代码被替换为“模型”。控制器包含逻辑来决定将模型的对象实例传递给“视图”

    • “控制器”没有硬链接到任何视图。考虑它的最佳方式。控制器可以处理多个“动作”。每个“Action”的处理代码可以返回一个“View”。这是呈现给用户的“视图”。

    • 一个视图可以在一个控制器内的多个操作之间共享,也可以在多个控制器之间共享。

    • 您可以灵活地将视图分解为部分视图(类似于母版页/内容页的概念)

    从这个角度来看,这是一种可行的方法。

    获取几个 .aspx 页面并将它们更改为视图。这样做时,请尝试将代码隐藏中的代码重构为模型。您找到的任何调用数据库并创建要呈现的数据对象的代码,将它们移动到控制器中。

    以您的通用用户控件为例,将其转换为视图,并使其与您转换为视图的上述 .aspx 页面一起作为局部视图工作。

    练习应该让您很好地了解您的移植选项是什么。

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 2010-09-06
      • 2010-09-06
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多