【问题标题】:MVC partial views, partial model, partial controller?MVC 部分视图、部分模型、部分控制器?
【发布时间】:2013-10-28 12:47:22
【问题描述】:

目前我正在调查 MVC 是否适合我们的 Web 应用程序的新主要版本。我们有一个现有的带有 webpart 的 web 应用程序,根据一些用户设置动态呈现。每个 webpart 都有自己的数据和逻辑(例如,一个带有用户信息的 webpart、一个带有当前登录用户的 webpart、一个带有约会等的 webpart)。

我们需要完成的(我认为)是渲染一个包含多个局部视图的视图。每个局部视图代表一个不同的模型,并有自己的逻辑。

我想出了如何将多个部分视图放在一个视图中,但我不知道如何处理每个视图的业务逻辑(在“部分控制器”中?如果可能的话?),并处理模型每个视图?

所以主要目的是渲染一个具有多个动态视图的页面(根据用户的配置),每个视图都有自己的逻辑和数据。然后,例如,当在局部视图中单击按钮时,会调用相应的控制器来处理该事件,并返回更新后的局部视图。部分视图需要松散耦合,并异步更新。

据我目前所见,大多数教程和文档通常都关注 MVC,而不是如何为每个局部视图分离业务逻辑和模型。

所以我不是在问如何做到这一点,而是:

  • 是否可以使用 MVC 4 或 5 轻松完成此任务?

  • 有人知道这方面的真实例子或教程吗?

我希望任何人都可以指出我正确的方向或对此分享一些想法......

【问题讨论】:

  • 如果你有重复的页面,部分视图很棒,你可以只写一次标记。像消息帖子等。如果您有大量使用 Javascript 进出的标记,它们也很有用。部分视图从托管它们的视图提供的视图模型中访问它们的数据。他们没有自己的逻辑。您可以拥有一个已存储数据的视图模型,然后将其呈现在部分视图中,但逻辑不会保留在部分视图中。逻辑工作在控制器而不是视图中完成。
  • 感谢您的回答。在我的主视图中为我要渲染的每个局部视图调用 @Html.Action("MyAction","PartialController1") 怎么样,让所有那些小的“局部”控制器执行自己的逻辑并返回自己的特定局部视图,每个都有自己的@model,这是最佳做法吗??
  • 您没有部分控制器,它只是您要调用的控制器。没有什么可以阻止您通过访问控制器操作返回部分视图。您的问题是部分视图使用的数据类型受到托管部分视图的视图的限制。如果您希望全部在部分中完成,我会看到的唯一方法是让每个部分视图调用自己的 javascript 文件,该文件可以访问和返回数据以填充它。这确实意味着您的网站依赖于在浏览器中打开的 JS。
  • James,但是在我在过去一小时内编写的这个小测试中,我强烈键入我的 parial 视图,如下所示:@model IEnumerable,并在像这样的部分视图:Html.DisplayFor(Model.First().UserName) 等。你能告诉我“部分视图使用的数据类型受托管部分视图的视图限制”的意思吗???跨度>
  • 在您的局部视图中,正在使用的用户名来自传入您的视图UserInfo 的 ViewModel。因此,您在部分视图中被限制为传递给视图的信息。每个局部视图都没有自己的局部控制器或自己的数据类型。它正在使用其父级的数据类型。

标签: asp.net-mvc asp.net-mvc-4


【解决方案1】:

您可以为每个 Web 部件创建一个或多个控制器。

将所有相关的 webpart 分组在同一个控制器中,但为每个 webpart 创建一个操作和 View+ViewModel。然后使用 Html.RenderAction 方法在您的页面/主视图上调用这些操作(并放置您的 Web 部件)。

免责声明:也就是说,每次调用 Html.RenderAction 都会创建一个完整的 mvc 流,实例化一个控制器、模型和视图,最后渲染整个事物并将值传递给您的页面/主视图。拥有大量 Html.RenderAction 可能会大大减慢您的页面创建速度。您可以像 Unity 一样研究 DI/IoC 并考虑重用控制器,或者只研究 System.Web.Mvc.DependencyResolver 来自己处理控制器的创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-15
    • 2015-12-06
    • 2017-12-30
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多