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

.NET MVC应用程序中的可重用性单元是什么?

  •  19
  • ctford  · 技术社区  · 15 年前

    在传统的ASP.NET Web窗体应用程序中,用户控件是封装功能以便重用的一种很好的方法。但是,用户控件不适合MVC模型。它们经常大量使用视图状态,并且模糊了MVC所促进的关注的分离。

    我的问题是,如何最好地捆绑一个功能,以便在MVC应用程序之间共享它?

    例如,考虑一个从/到日期选择器用户控件:

    • 允许用户选择两个日期,要么使用javascript覆盖,要么在单独的字段中键入日、月和年。
    • 可以配置为默认为今天和明天的日期或开发人员选择的日期
    • 验证从用户返回的日期,以确保开始日期早于结束日期
    • 从和向属性公开可由代码隐藏访问的属性

    我如何才能在.NET MVC中最好地构建这样的东西,以便我可以轻松地重用它?

    请注意,要完全模拟用户控件的功能,MVC组件必须管理提交的表单数据和验证,而不仅仅是演示文稿。

    7 回复  |  直到 10 年前
        1
  •  6
  •   Zhaph - Ben Duguid    15 年前

    一般来说,我同意用户控件在封装UI方面是很好的,但我认为MVC中并没有太大的变化。如果我记得在经典的ASP.NET项目中正确地重新使用用户控件是一件痛苦的事情,而且从来不是真正创建可重用组件的最佳方法。您为经典ASP.NET购买的大多数UI工具包都没有提供用户控件,它们基本上提供了服务器控件和JavaScript控件。

    在您的示例中,我可能会创建或找到一个jquery(或选择的UR框架)插件,该插件在客户端执行了您想要的操作。您还可以围绕它构建一个C包装器,类似于Telerik对一些jQueryUI控件所做的操作。我认为这个词 代码隐藏 甚至 视图状态 你进入MVC的次数越多,你的词汇表就会消失。

    如果你看看MVC的开源项目是什么,你会从你应该做什么得到你的答案。

    • 这个 MVC Contrib 应用程序通过创建扩展方法和帮助器添加了很多功能。他们的网格控件是创建可重用组件的一种典型方法,您可以跨项目使用该组件。

    • Telerik 创建了一些扩展来包装jquery控件并进行资产管理。

    • 最后,我想如果你展望未来,MVC已经 areas ,如果我正确地解释它,将使您能够将项目分解为多个较小的项目。
        2
  •  2
  •   queen3    15 年前

    除了已经建议的以外,ASP.NET MVC v2还将具有通用的模板化输入控件,请参见 here . 例如,你可以阅读其他人如何使用类似的技术, here :

    我们有 正好1个方法调用来生成 表单元素,__html.inputfor__。AS 部分输入,它检查 一种输入规范,它收集 属性信息,任何属性,以及 类型,调用的任何修饰符,以及 选择适当的输入生成器。 调用inputfor(p=>p.id),id是 GUID?创建隐藏输入 元素。呼叫输入(P=> p.客户地址),地址为 复合型?它寻找一个 具有相同类型名称的分部

        3
  •  2
  •   ctford    15 年前

    考虑到其他人的有益回答,我会主动回答自己的问题。

    在我看来,在MVC中模拟用户控件的关键困难在于,它们横切了MVC要分离的关注点。在我的示例中,从/到日期选择器usercontrol包含模型、视图、控件和交互元素。用户控件将所有这些捆绑在一起的能力正是它们不适合MVC的原因。

    这意味着在MVC中创建psuedo用户控件需要四个独立的部分:

    • 模型类-在本例中是间隔类或类似类
    • 知道如何将模型呈现为HTML的PartialView
    • 一个jquery脚本,用于在partialview的HTML之上分层交互。
    • 可以将PostData反序列化为模型类实例的ModelBinder。

    ModelBinder很重要,因为它处理从用户返回的数据。如果没有它,每个想要在其任何视图中显示“到/从”日期选择器的控制器都必须知道如何组装六个PostData字段,以及如何处理它们是否无效或某些字段丢失。

        4
  •  1
  •   griegs    15 年前

    我能想到两种方法。一个局部视图,虽然这并不能很好地从一个应用程序转移到另一个应用程序,因为你正在移动的ASCX文件。不是很痛,但不是我的味道。

    我更喜欢使用 网络控件 . 它们在MVC中非常简单,您所需要做的就是引用项目中的库,也可能引用配置文件中的库。

        5
  •  0
  •   Dave Archer    15 年前

    我认为有些答案遗漏了控件的回发功能。您可以处理的一种方法是在呈现局部视图时通过VIEWDATA传递任何一般信息。这样就可以回到自己的控制中,反过来又可以重定向到urlrefer。

    它有点乱,使用urlrefer会带来安全风险。但这是解决问题的一种方法

        6
  •  0
  •   Alon Gubkin    15 年前

    您可以创建一个 jQuery plugin .

        7
  •  0
  •   Anirudha Gupta    10 年前

    作为在ASP.NET WebForms中提供的用户控件,MVC提供了许多方法来使控件和代码可以在其他应用程序中重用。

    使用分词 如果您的部分代码有一些C逻辑,并使用razor/aspx代码呈现HTML,那么将它们维护在razor文件中是BST。

    将javascript功能作为插件写入 如果你维护你的代码,并把它写得和其他应用程序一样好,那么这对你来说将是一个巨大的优势。下次当你在其他应用上工作时,只需打开这个解决方案,复制并修改它。编写可以用作插件的javascript代码可能需要更多的头脑风暴。

    将代码编写为单独的C库 如果某些代码对于您制作的每个应用程序都太常见,例如,您编写了一个成员身份验证系统或在您制作的每个应用程序中使用的某个全局函数(C),然后将它们保存在单独的解决方案中,以便将来每当您尝试制作新的应用程序时,都可以在您制作的其他应用程序中使用。