asp.net-mvc – 在ASP.NET MVC中保护ViewModel
我有一个由许多用户控件组成的页面.此页面的视图模型相当复杂.
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,然后控制器打开3个存储库,对每个存储库进行多次调用并构建视图模型.至少可以说我的控制器动作已经变得非常大了. 这是迄今为止我工作过的最复杂的页面,我很难决定如何使其更简单. 我的第一个想法是创建一个视图模型工厂,在绑定验证之后,它将调用存储库并返回ViewModel. 然后我考虑创建一个自定义模型绑定器,它将验证PostModel,然后一步化水合ViewModel. 所以我的问题是如何为复杂的视图模型提供水合作用? 在我写这篇文章时,我想到了使用Html.RenderAction并为构成这个页面的野兽的每个用户控件创建一个模型. 更新: 存储库调用WCF服务,该应用程序是更大的SOA arch的一部分. 解决方法
一些一般提示.数据可以分为几类:系统范围,会话范围,请求范围.
系统范围数据是需要呈现给用户的数据,但对于每个用户是相同的.博客应用程序的示例可以是标签云或类别列表.我认为这个数据不需要流经控制器或动作,因为它与用户交互无关. View本身可以调用HtmlHelper(或LayoutDataHelper),它知道如何获取(并且最好是缓存)这些数据. 可以使用填充ViewData.Model上的字段的ActionFilter处理会话范围数据.它与动作的参数没有直接关系.例如,用户名.我更喜欢表格的属性 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 } } } 必须在Action中填充请求范围/特定的所有其他内容.但是,这并不意味着你必须有一个大规模的动作方法来做到这一点.我会看看你的ViewModel是如何组成的.正如您所建议的,如果您有需要填充的控件,则ViewModel中的信息可能会被分组到相关集中.因此,您可能有一个仅构成其他较小视图模型的ViewModel(“局部视图模型”).然后,我将分解逻辑以将每个局部视图模型(以及任何其他复杂逻辑)填充到其自己的可重用和隔离方法中. 处理帖子时类似的抽象适用,但我会担心发布大量不相关数据的页面的可用性.您应该能够使用ActionFilters(OnActionExecuting)来解析相关的传入数据集(并可选地进行验证),并将它们分配给操作参数.除了将相同的数据集发布到多个操作并且传入数据的形状始终相同之外,我更喜欢使用过滤器而不是发布数据的绑定器. 祝好运. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- oauth-2.0 – 使用DotNetOpenAuth创建OAuth 2.0服务提供程序
- asp.net-mvc – 用于对Office 365 AD进行身份验证的MVC
- asp.net – 如何使用Ajax.BeginForm OnSuccess和OnFailure方
- Asp.NET DropDownList在PostBack之后重置SelectedIndex
- asp.net-mvc – 是否可以绑定资源文件X以发布配置文件Y?
- asp.net – 多个域的集成Windows身份验证
- asp.net-mvc – 适当地url编码空间字符
- asp.net-mvc – 分页助手asp.net mvc
- asp.net-mvc – 使用自定义段变量设置ASP.Net MVC 4路由
- asp.net-mvc – 使用ui-router的.NET MVC和Angular
- asp.net – 如何设置Thread.CurrentPrincipal以在
- ASP.Net的Web TWAIN扫描解决方案?
- 如何使用Castle Windsor与ASP.Net Web表单?
- asp.net – WebFormsMVP的缺点?
- asp.net – 所有PartialView的自定义ActionResul
- 文件上传 – 是否可以在上传文件的asp.net webap
- asp.net-mvc – 无法在Global.asax上加载类型Mvc
- asp.net-core – 使用.net核心进行Hangfire依赖注
- asp.net-mvc – 命名约定 – 控制器的一个规则,没
- asp.net – 跟踪当前在线用户的最佳方式