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


像这个网站上的许多其他人一样,我正在考虑转向ASP.NET MVC以用于未来的项目。目前我的网站正在运行传统的ASP.NET 2.0 Web窗体,它对我们来说还可以,所以我的另一个选择就是坚持我所知道的,并使用集成的AJAX东西转移到ASP.NET 3.5。

我想知道用户控件如何在ASP.NET MVC中工作。我们有很多 .ASCX 控件和一些复合控件。当我与网页设计师合作时,即使没有任何编程知识,也很容易让他们有效地使用ASCX控件,这是一个明确的优点。但当然缺点是页面生命周期,这可能令人抓狂,并且ASCX控件很难在不同项目之间共享。复合控件是可共享的,但基本上是设计师的黑盒子。

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


12174
2017-09-03 13:55


起源



答案:


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

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

您可能还会看到PR5中的旧语法不再有效

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

从Web Forms迁移到MVC时,您将始终担心代码中断,但是ASP.NET MVC团队已经做了很好的工作来最小化问题。


8
2017-09-03 13:58





正如Nick建议的那样,你确实能够呈现你的用户控件,但很明显,传统ASP Webforms的页面循环,页面状态和回发将不再起作用,从而使你的控件很可能无用。

我认为你必须重写大部分复杂的控件来将你的网站移植到MVC,而简单的控件,例如,只提供格式化和没有回发状态,应该只是工作。 尼克提供的代码只适用于这种情况。

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


1
2017-09-03 14:08





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

你可以考虑重写这个。

aspx就是 视图。你仍然需要重写,语法不同。 JavaScript会起作用。但我几乎没有发现WebControls会起作用。因为MVC不再具有viewstate和postback了。

对于后面的代码(aspx.cs),您需要将其转换为a 调节器 类。 Page_Load 方法将不再有效。你可能会留下它 Index() 方法。

模型 只是你的代码背后消耗的实体类。

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


1
2018-03-04 09:47





是的,你可以做RenderPartial。这是一个好的开始。但最终这些家伙需要逻辑和其他控制器类型的东西。请留意框架团队的子控制器实现。很快MvcContrib也应该有一些东西。或者自己滚动。

编辑: 我刚刚在这里发布了这个: http://mhinze.com/subcontrollers-in-aspnet-mvc/


1
2017-09-05 01:59



这有一个死链接。 - chrish


答案:


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

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

您可能还会看到PR5中的旧语法不再有效

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

从Web Forms迁移到MVC时,您将始终担心代码中断,但是ASP.NET MVC团队已经做了很好的工作来最小化问题。


8
2017-09-03 13:58





正如Nick建议的那样,你确实能够呈现你的用户控件,但很明显,传统ASP Webforms的页面循环,页面状态和回发将不再起作用,从而使你的控件很可能无用。

我认为你必须重写大部分复杂的控件来将你的网站移植到MVC,而简单的控件,例如,只提供格式化和没有回发状态,应该只是工作。 尼克提供的代码只适用于这种情况。

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


1
2017-09-03 14:08





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

你可以考虑重写这个。

aspx就是 视图。你仍然需要重写,语法不同。 JavaScript会起作用。但我几乎没有发现WebControls会起作用。因为MVC不再具有viewstate和postback了。

对于后面的代码(aspx.cs),您需要将其转换为a 调节器 类。 Page_Load 方法将不再有效。你可能会留下它 Index() 方法。

模型 只是你的代码背后消耗的实体类。

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


1
2018-03-04 09:47





是的,你可以做RenderPartial。这是一个好的开始。但最终这些家伙需要逻辑和其他控制器类型的东西。请留意框架团队的子控制器实现。很快MvcContrib也应该有一些东西。或者自己滚动。

编辑: 我刚刚在这里发布了这个: http://mhinze.com/subcontrollers-in-aspnet-mvc/


1
2017-09-05 01:59



这有一个死链接。 - chrish