Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net .NETMVC应用程序的可重用性单位是什么?_Asp.net_Asp.net Mvc - Fatal编程技术网

Asp.net .NETMVC应用程序的可重用性单位是什么?

Asp.net .NETMVC应用程序的可重用性单位是什么?,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,在传统的ASP.NET Web表单应用程序中,UserControls是封装功能以便重用的好方法。然而,用户控件并不适合MVC模型。它们经常大量使用ViewState,并且模糊了MVC促进的关注点分离 我的问题是,如何最好地捆绑一项功能,以便跨MVC应用程序共享 作为一个例子,考虑一个从/到日期选择器USER控件: 允许用户选择两个日期,可以使用javascript覆盖,也可以在单独的字段中键入日期、月份和年份 可以配置为默认为今天和明天的日期或开发人员选择的日期 验证从用户返回的日期,以确保

在传统的ASP.NET Web表单应用程序中,UserControls是封装功能以便重用的好方法。然而,用户控件并不适合MVC模型。它们经常大量使用ViewState,并且模糊了MVC促进的关注点分离

我的问题是,如何最好地捆绑一项功能,以便跨MVC应用程序共享

作为一个例子,考虑一个从/到日期选择器USER控件:

  • 允许用户选择两个日期,可以使用javascript覆盖,也可以在单独的字段中键入日期、月份和年份
  • 可以配置为默认为今天和明天的日期或开发人员选择的日期
  • 验证从用户返回的日期,以确保开始日期早于结束日期
  • 公开可由代码隐藏访问的属性
如何在.NETMVC中最好地构建这样的东西,以便可以轻松地重用它


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

我可以想到两种方法。一个局部视图,但这并不能很好地从一个应用程序传输到另一个应用程序,因为您正在移动ascx文件。不是很大的痛苦,但不是我的味道


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

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

在您的示例中,我可能会创建或找到一个jquery(或您选择的ur框架)插件,它在客户端实现了您想要的功能。您还可以围绕它构建一个C#包装器,类似于Telerik对一些jQueryUI控件所做的。我确实认为代码隐藏一词,甚至视图状态一词会随着你进入MVC而从你的词汇表中消失

如果你看看MVC有哪些开源项目,你就会得到你应该做什么的答案

  • 该应用程序通过创建扩展方法和帮助程序添加了许多功能。他们的网格控制是创建可跨项目使用的可重用组件的典型方法

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

  • 最后,我认为如果你展望未来,MVC已经实现了,如果我正确理解它,它将使你能够将你的项目分解为多个较小的项目

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

我们有 正好有1个方法调用用于生成 表单元素“Html.InputFor”。作为 它是“输入”的一部分 一种输入规范,用于收集 PropertyInfo、任何属性和 类型、调用的任何修饰符和 选择适当的InputBuilder。 调用InputFor(p=>p.Id),Id是一个 GUID?这将创建一个隐藏的输入 元素。调用InputFor(p=> p、 客户。地址)和地址是 复杂类型?那看起来像是一个 具有相同类型名称的分部


我认为有些答案遗漏了控件的回发功能。一种处理方法是在渲染局部视图时通过ViewData传递任何常规信息。然后,它可以发回自己的控件,而该控件又可以重定向到URLreferer


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

在考虑了其他人的有用答案后,我将尝试回答我自己的问题

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

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

  • 模型类—在本例中为区间类或类似类
  • 了解如何将模型呈现为HTML的PartialView
  • 在PartialView的HTML之上分层交互的jQuery脚本
  • 可以将postdata反序列化到模型类实例中的ModelBinder

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

您可以创建一个。

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

使用部分如果您的部分代码有一些C#逻辑,并使用Razor/aspx代码呈现html,则bst需要在Razor文件中维护它们

将JavaScript功能编写为插件如果您维护代码并将其编写得尽可能好,以便在其他应用程序中使用,那么这将是一个巨大的优势。下次在其他应用上工作时,只需打开此解决方案,复制并修改它。编写JavaScr