Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 干燥MVC辅助选项_C#_Asp.net Mvc_Dry - Fatal编程技术网

C# 干燥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();

设想一个包含网格的MVC视图:

@{
    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
通常是第一个实现的。整个层由运行自定义LINQ
Select(lambda)
语句的静态函数组成。不确定其他人是否同意此点:)@Flater:静态函数听起来像是可以通过实例方法和可注入依赖项重构成适当服务的东西。@WiktorZychla:我的项目从来没有达到与这种实现相关的大小或范围。QuickPerson的问题在于筛选和排序,columnBuilder构建网格列和过滤框,然后我们的查询引擎自动向查询添加所需的过滤和排序。但是查询引擎对QuickPerson一无所知,它只处理实体。