C# 干燥MVC辅助选项
设想一个包含网格的MVC视图:C# 干燥MVC辅助选项,c#,asp.net-mvc,dry,C#,Asp.net Mvc,Dry,设想一个包含网格的MVC视图: @{ Html.Grid( autoGenerateColumn: false, Url : "/Grid/GetData", columnBuilderAction: p => { p.Add(c => c.Name, "100"); p.Add(c => c.Code, "100").AlignCenter();
@{
Html.Grid(
autoGenerateColumn: false,
Url : "/Grid/GetData",
columnBuilderAction: p =>
{
p.Add(c => c.Name, "100");
p.Add(c => c.Code, "100").AlignCenter();
}
);
}
URL指定返回包含填充网格数据的json数组的操作。
显然“/Grid/GetData”应该只返回person的Name和Code属性,但person有更多属性
如果我们在GetData操作中指定此属性,则违反了DRY
如果我们将这些属性从客户机(使用网格的Ajax请求)传递到action,则需要更多的通信量
如果该属性在控制器中定义,则将ViewData传递给grid并与GetData操作共享,这是不漂亮的(在我看来!)
是否有任何最佳做法或合适的做法 在控制器中,您可以定义要显示的视图(或者在您的情况下,定义要传递给视图的信息) 在这种情况下。。。您有一个控制器
人员,和一个索引操作。在索引视图中。。。您可以设置网格
所以。。。对于我来说,只为视图提供一个子集Person属性是非常好的。请记住,您应该将VIEWMODELS发送到视图,而不是域模型。所以,在这种情况下。。。如果你只需要名字和代码。。。您可以使用这些属性创建一个QuickPerson
类。。。并在数据库查询中执行以下操作:
.Select(x => new QuickPerson(){ Code = x.Code, Name = x.Name})
不确定columnBuilderAction
是否可以自动检测属性以避免这种情况
如果不设置columnBuilder,会发生什么?如果它使用模型的所有公共属性。。。然后你就解决了这个问题,因为你的新的QuickPerson
模型正好有需要的。对于类似的问题,我们通常在db和MVC之间有一个自定义层,允许检索自定义列表(即,您只需要一组给定属性的列表。SelectList
通常是第一个实现的。整个层由运行自定义LINQSelect(lambda)
语句的静态函数组成。不确定其他人是否同意此点:)@Flater:静态函数听起来像是可以通过实例方法和可注入依赖项重构成适当服务的东西。@WiktorZychla:我的项目从来没有达到与这种实现相关的大小或范围。QuickPerson的问题在于筛选和排序,columnBuilder构建网格列和过滤框,然后我们的查询引擎自动向查询添加所需的过滤和排序。但是查询引擎对QuickPerson一无所知,它只处理实体。