在MVC控制器中构建网格

时间:2014-12-31 01:57:54

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

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

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

感谢您的任何想法。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

我的意思是你可以在视图中使用一些控件,你应该将它们解释为你不应该渲染的基本元素。如果使用jqGrid,您应该在要拥有网格的位置指定一个<table>属性为空的id元素。您将不会在视图中明确地重新绘制网格的元素。而不是你可以填写/设置&#34;属性&#34;基本网格元素。网格将填充您在页面上包含的JavaScript代码的数据以及您应该为jqGrid提供的相应控制器操作返回的数据。

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

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

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