在ASP.NET MVC中实现用户控件的最佳方法是什么?

在ASP.NET MVC中实现用户控件的最佳方法是什么?

What's the best way to implement user controls in ASP.NET MVC?

像该站点上的许多其他对象一样,我正在考虑为将来的项目迁移到ASP.NET MVC。当前,我的站点运行的是传统的ASP.NET 2.0 Web窗体,对我们来说可以正常使用,因此,我的另一个选择就是坚持我所知道的,并使用集成的AJAX东西迁移到ASP.NET 3.5。

我想知道用户控件如何在ASP.NET MVC中工作。我们有大量的.ASCX控件和一些复合控件。当我与Web设计人员一起工作时,即使没有任何编程知识,也很容易让他们有效地使用ASCX控件,因此这是绝对的优势。但是,当然,缺点是页面生命周期可能令人发疯,而且ASCX控件很难在不同项目之间共享。复合控件是可共享的,但对于设计人员来说基本上是一个黑匣子。

ASP.NET MVC中的模型是什么?有没有一种方法可以创建解决我们使用ASCX和复合控件处理的问题的控件?一个重要的考虑因素是允许Web设计人员轻松访问而不必担心代码被破坏。


要实现用户控件,请执行以下调用:

1
<% Html.RenderPartial("~/Views/Shared/MyControl.ascx", {data model object}) %>

您可能还会看到较旧的语法,从PR5开始该语法不再有效

1
<%= Html.RenderUserControl("~/Views/Shared/MyControl.ascx", {data model object}) %>

从Web窗体迁移到MVC时,您始终会担心代码会中断,但是ASP.NET MVC团队在减少问题方面做得很好。


与您的用户控件相比,MVC具有不同的页面生命周期。

您可以考虑将其重写。

aspx是视图。您仍然需要重新编写,语法不同。
JavaScript将起作用。但是我几乎找不到WebControls可以工作。因为MVC不再具有viewstate和postback。

对于背后的代码(aspx.cs),您需要将其转换为Controller类。
Page_Load方法将不再起作用。您可能将其留给Index()方法。

模型只是您的代码所消耗的实体类。

结论,这是完全重写。干杯。快乐的编码。


是的,您可以执行RenderPartial。这是一个好的开始。但是最终这些家伙将需要逻辑和其他控制器类型的东西。一直在寻找框架团队的子控制器实现。 MvcContrib中很快也应该有东西。或自己动手。

编辑:我刚刚在这里发布有关此内容:http://mhinze.com/subcontrollers-in-aspnet-mvc/


正如Nick所建议的那样,您确实可以呈现用户控件,但是显然,传统ASP Webforms的页面周期,页面状态和回发将不再起作用,从而使控件极有可能变得无用。

我认为您必须重写大多数复杂的控件才能将您的网站移植到MVC,而简单的控件(例如仅提供格式设置而没有回发状态)应该可以正常工作。
在这种情况下,尼克提供的代码将很有效。

关于在更多项目之间共享:我认为控件将更像可以在网站上共享的"可重用HTML呈现组件",而不是带有逻辑的"可重用代码组件"(例如WebForms控件)。您的网络逻辑将/应该在页面控制器中,而不在HTML控件中。因此,在更多项目中共享控件不会像在WebForms案例中那样有用。


推荐阅读