【问题标题】:Building Grid in MVC Controller在 MVC 控制器中构建网格
【发布时间】:2015-02-27 04:40:15
【问题描述】:

我有一个图案/设计问题。在 asp mvc 应用程序的控制器中构建网格是否被认为是不好的做法?

例如,有用于 jqgrid 的服务器端适配器,您可以在其中填充特定模型以构建网格。这包括构建列,包括列选项(宽度、排序索引、可退出等)。
我通常会将网格的构建视为应该驻留在视图中的演示模板/脚手架。我通常更愿意将网格设置代码保留给视图,让控制器将数据传递给视图。我是不是想错了?

感谢您的任何想法。

【问题讨论】:

    标签: jquery asp.net-mvc asp.net-mvc-4 jqgrid


    【解决方案1】:

    我同意视图应该管理表示问题,而控制器应该处理向客户端发送数据、处理任何业务逻辑以及响应视图事件(按钮单击等)。所以我同意视图应该渲染网格,控制器应该发送数据。

    【讨论】:

      【解决方案2】:

      我也同意,控制器应该驱动数据,视图应该驱动数据的显示。然而,由于控制器定义了数据的结构,在某种程度上,它确实驱动了网格的某些方面的显示。理想情况下,我不希望每次更改底层模型时都必须更改视图和控制器(尽管有时您必须这样做)。我更喜欢有一个地方来定义模型,控制器可以访问以构造数据,视图可以访问以构建网格。然后将任何自定义显示细节留给视图中的网格定义。

      【讨论】:

        【解决方案3】:

        问题是视图中使用的元素多深需要由视图指定。只是一个例子。您可以在视图中使用<select> 元素,它在不同的网络浏览器中看起来会有些不同。您可以在页面上使用的基本元素可能更复杂。只需尝试在 HTML5 中使用 <input type="date">(请参阅 here 并在 Google Chrome 中尝试 the demo)。您将看到许多内置日期选择器的元素,这些元素并未在视图中显式呈现(通过演示模板)。

        我的意思是你可以在视图中使用一些你应该解释为你不应该渲染的基本元素的控件。在使用 jqGrid 的情况下,您应该只在您想要拥有网格的位置指定一个带有 id 属性的空 <table> 元素。您不会在视图中明确租用网格的元素。取而代之的是,您可以填充/设置基本网格元素的“属性”。网格将填充与您在页面上包含的 JavaScript 代码相关的数据以及从您应该为 jqGrid 提供的相应控制器操作返回的数据。

        我同意这种模式与 MVC 模型的匹配并不理想,但我个人不赞成教条式地遵循某些模型。

        我在上述架构中看到的唯一真正的设计问题是在定义网格colModel 的某些部分时存在限制,主要是在 JavaScript 代码中。在使用动态系统的情况下,为网格提供colModel 属性连同数据 可能更有趣。 jqGrid 没有提供直接的方法来做到这一点,但我发布了一些答案,描述了如何进行相应的实现。主要思想包括使用setColPropshowColhideColsetCaptionsetLabelsetColWidthbeforeProcessing 的其他内部。它允许编写通用 JavaScript 代码来显示任何通用网格并从服务器加载网格的所有属性。我建议您阅读提供一些重要代码片段的the answerthe answer

        如果需要,可以使用addColumn 方法而不是创建具有许多隐藏列的网格并在那里显示,该方法仍处于测试阶段,但它工作得很好,我发布了here 的代码(请参阅相应的示例demos 子目录)。

        【讨论】:

        • 我想我明白你的意思了——你正在返回有关数据的通用信息,然后在客户端上使用 javascript 来解释该数据。但是,如果您要发送有关 UI 关注点的信息——显示列、列宽等——并不是将 UI 关注点与业务逻辑混合在一起。最大的问题是列的宽度 - 在我看来,这完全是 UI 问题,不应该存在于数据中。
        猜你喜欢
        • 1970-01-01
        • 2021-05-19
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 2011-01-28
        • 2013-12-28
        • 2012-08-20
        • 1970-01-01
        相关资源
        最近更新 更多