在MVC控制器中构建网格

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

例如,jqgrid有服务器端适配器,您可以在其中填充特定模型以构建网格。 这包括构造列,包括列选项(宽度,sortindex,exitable等)。
我通常会将网格的构造看作应该驻留在视图中的表示模板/脚手架。 我通常更喜欢将网格设置代码保留到视图中,并让控制器将数据传递给视图。 我是以错误的方式想到这个吗?

谢谢你的任何想法。

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

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

问题是视图中需要指定视图中使用的元素的深度 。 只是一个例子。 您可以在视图中使用元素,它在不同的Web浏览器中看起来会有所不同。 您可以在页面上的基本元素可能更复杂。 只需尝试使用HTML5中的 (请参阅此处并在Google Chrome中尝试演示 )。 您将看到内置日期选择器的许多元素,您未在视图中显式呈现(通过演示模板)。

我的意思是你可以在视图中使用一些控件,你应该将它们解释为你不应该渲染的基本元素。 在使用jqGrid的情况下,您应该在要拥有网格的位置指定一个带有id属性的空

元素。 您将不会在视图中明确地重新绘制网格的元素。 而不是你可以填充/设置基础网格元素的“属性”。 网格将填充您在页面上包含的JavaScript代码的数据以及您应为jqGrid提供的相应控制器操作返回的数据。

我同意这种模式与MVC模型的匹配并不理想,但我个人不喜欢跟随某些模型的教条。

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

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