gpt4 book ai didi

asp.net-mvc - 在 ASP.NET MVC 中补充 ViewModel

转载 作者:行者123 更新时间:2023-12-02 19:47:48 27 4
gpt4 key购买 nike

我有一个由许多用户控件组成的页面。该页面的 View 模型相当复杂。

public class ComplexViewModel
{
public ObjectA ObjectAProperty { get; set; }
public List<Things> ListOfThings { get; set; }
public List<ThingCategories> ListOfThingCategories { get; set; }
public List<ThingTypes> ListOfThingTypes { get; set; }
public List<ThingOptions> ListOfThingOptions { get; set; }
public int ChosenThingCategoryId { get; set; }
public int ChosenThingTypeId { get; set; }
public int ChosenThingOptionId { get; set; }
public OtherObject ObjectData { get; set; }
}

该页面还有一个 PostModel,其中包含用于过滤、排序等的信息。

    public class SimplePostModel
{
public int ChosenThingCategoryId { get; set; }
public int ChosenThingTypeId { get; set; }
public int ChosenThingOptionId { get; set; }
public int ChosenThingFilterTypeId { get; set; }
public int ChosenThingSortTypeId { get; set; }
public int ChosenThingOtherId { get; set; }
public int ChosenThingMoreId { get; set; }
public int ChosenThingOMGId { get; set; }
}

简单的 PostModel 经过验证,然后 Controller 打开 3 个以上存储库,对每个存储库进行多次调用并构建 View 模型。至少可以说我的 Controller Action 已经变得相当大了。

这是迄今为止我处理过的最复杂的页面,我很难决定如何使其变得更简单。

我的第一个想法是创建一个 View 模型工厂,在绑定(bind)验证后,它将调用存储库并返回 ViewModel。

然后我考虑创建一个自定义模型绑定(bind)器来验证 PostModel,然后一步水化 ViewModel。

所以我的问题是如何水合复杂的 View 模型?

当我写这篇文章时,我想到了使用 Html.RenderAction 并为构成这个页面的每个用户控件创建一个模型。

更新:

存储库调用 WCF 服务,应用程序是更大的 SOA 架构的一部分。

最佳答案

一些一般提示。数据可以分为几类:系统范围、 session 范围、请求范围。

系统范围数据是需要呈现给用户但对于每个用户都是相同的数据。博客应用程序的一个示例是标签云或类别列表。我认为这些数据不需要流经 Controller 或操作,因为它与用户交互无关。 View 本身可以调用知道如何获取(最好是缓存)此数据的 HtmlHelper(或 LayoutDataHelper)。

可以使用填充 ViewData.Model 字段的 ActionFilters 来处理 session 范围数据。它与 Action 的参数没有直接关系。例如,用户名。我更喜欢表单的属性

public class SessionDataFilter : ActionFilter 
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Result is ViewResult)
{
var view = filterContext.Result as ViewResult;

// hydrate session data on view.ViewData.Model
}
}
}

所有其他请求范围/特定的内容都必须填充在操作中。然而,这并不意味着你必须有一种大规模的行动方法才能做到这一点。我会看看你的 ViewModel 是如何组成的。正如您所建议的,如果您有需要填充的控件,则 ViewModel 中的信息很可能可以分组为相关的集合。因此,您可能有一个仅组成其他较小 View 模型(“部分 View 模型”)的 ViewModel。然后,我将分解逻辑以将每个部分 View 模型(以及任何其他复杂逻辑)填充到其自己的可重用和隔离的方法中。

在处理帖子时,类似的抽象也适用,尽管我会担心发布大量不相关数据的页面的可用性。您应该能够使用 ActionFilters (OnActionExecuting) 解析相关的传入数据集(以及可选的验证)并将它们分配给操作参数。对于已发布的数据,我更喜欢过滤器而不是 Binder ,除非将同一组数据发布到多个操作并且传入数据的形状始终相同。

祝你好运。

关于asp.net-mvc - 在 ASP.NET MVC 中补充 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2099177/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com