代码之家  ›  专栏  ›  技术社区  ›  Nate CSS Guy

在视图或控制器中,我的“过滤”逻辑应该与LINQ-2-SQL和ASP.NET-MVC一起驻留在哪里?

  •  0
  • Nate CSS Guy  · 技术社区  · 15 年前

    我有一张主桌,有几张“儿童”桌。表A和表Achild1和表Achild2。

    我有一个视图,它显示了表A中的信息,然后分别有表Achild1和表Achild2中所有项目的两列,它们用局部视图呈现。

    两个子表都有一个位字段用于visibletoall,根据用户角色的不同,我希望显示所有相关行,或者visibletoall=true的相关行。

    这段代码看起来应该在控制器中,但我不确定它会是什么样子,因为就目前来看,控制器(限制版本)是这样的:

    return View("TableADetailView", repos.GetTableA(id));
    

    这种方法是否有效?如果提交了我的DataContext,会不会删除所有visibleToAll==false的行?

    var tblA = repos.GetTableA(id);
    tblA.TableAChild1 = tblA.TableAChild1.Where(tmp => tmp.VisibleToAll == true);
    tblA.TableAChild2 = tblA.TableAChild2.Where(tmp => tmp.VisibleToAll == true);
    return View("TableADetailView", tblA);
    

    从主视图向rendarpartial调用添加该逻辑也很简单:

    <% Html.RenderPartial("TableAChild1", Model.TableAChild1.Where(tmp => tmp.VisibleToAll == true); %>
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Keith Adler    15 年前

    我认为这是一个很有争议的话题。对我来说,有两条明确的路线:

    延迟执行路由 不要使用tolist,在控制器中总是使用asqueryable。这意味着仅检索表示所需的数据,并且仅当调用tolist等时,才在视图中需要该数据。

    演示文稿显示模型 使用已筛选的模型类或结果准备用于表示的数据。将视图强键入预期格式。

    我自己更喜欢延迟执行,尽管在纯MVC结构中,控制器应该担心获取信息,视图应该只显示模式。

    无论如何,请确保将asqueryable用于存储库。

        2
  •  3
  •   Sayed Ibrahim Hashimi    15 年前

    对我来说 毫无疑问 . 控制器不应将iQueryable返回到视图。视图不应该具有执行此类筛选的逻辑,因此必须在控制器或控制器调用的对象中执行此操作。如果你的观点有这样的逻辑,那就太聪明了!我知道听起来好像 宣传视图模型 “(作为) JFAR 在前一篇文章中发表了评论)或最佳实践,但这些定义是有原因的。逻辑太多的视图太难维护,您也可以使用ASP.NET。( 或经典ASP )关于那件事。

    老实说,我甚至不认为您的控制器应该为此使用iqueryable本身。这个逻辑应该包含在一个单独的层中,该层将列表返回给控制器。使用iQueryEverywhere的问题是,当事情处于同一层时,这样做是可行的,但是如果你将数据访问放在WCF服务之后,你的整个应用程序就会崩溃。你的 哪里 视图中的语句以及控制器会抱怨由于上下文不再可用而无法访问上下文。