代码之家  ›  专栏  ›  技术社区  ›  Alex P

关于使用ASP.NET MVC显示和允许编辑数据的建议?

  •  1
  • Alex P  · 技术社区  · 16 年前

    我正在着手我的第一个ASP.NET MVC项目,我想获得一些关于显示数据库数据和一般最佳实践的可能方法的输入。

    简言之,我的网页正文将以类似表格的格式显示数据库中的数据,每个表格行显示类似的数据。例如:

    Name          Age       Position      Date Joined
    Jon Smith     23        Striker       18th Mar 2005
    John Doe      38        Defender      3rd Jan 1988
    

    在功能方面,主要是我想让用户能够编辑数据,并在编辑后将编辑提交到数据库并刷新视图。我想刷新视图的原因是数据是按日期顺序排列的,如果用户编辑日期字段,我需要重新排序。

    我的主要问题是什么架构/工具最适合这一点,以满足我在高层次上的需求?

    根据我迄今为止所做的研究,我的初步结论是:

    1. ADO.NET 用于数据检索。这是我以前用过的东西 感觉舒适。我喜欢 Linq to SQL的外观,但不需要 使学习曲线任意 我第一次踏入MVC时更陡 现在还没有着陆。

    2. 局部视图 创建模板,然后迭代 我收回的数据表 从我的数据库模型。

    3. JQuery 要允许用户编辑表中的数据,请进行错误检查。 编辑数据条目等。

    另外,我最初的观点是缓存数据在这里不是一个关键的需求。用户唯一能够更新的字段是字段,如果是,我需要立即将该数据提交到数据库,然后刷新视图(因为数据是按日期排序的)。 有什么想法吗?

    另外,我还看到了一些jquery插件,它们模拟数据报并提供相关功能。我的第一个想法是,我不需要这些插件附带的所有功能(例如,斑马条纹、在列标题中使用排序标志符号按列排序的能力等),而且我没有真正看到任何好处超过我上面概述的解决方案。 同样,有理由重新考虑这种观点吗?

    最后,当用户编辑日期时,我需要刷新视图。为了做到这一点,我一直在阅读有关html.renderation的内容,这似乎比使用部分视图更好,因为我可以将应用程序逻辑合并到action方法中。 我认为html.renderAction是正确的还是误解了它的用法?

    希望这篇文章写得清楚,不要太长。我确实为每个主题考虑了单独的文章(例如,局部视图与HTML.renderAction,何时使用jquery-datagrid插件),但感觉这些问题是如此交织,需要在彼此的上下文中处理。

    谢谢

    3 回复  |  直到 14 年前
        1
  •  1
  •   Jim Blake    14 年前

    数据访问 -如果你习惯的话,ado.net是很好的。我用亚音速主动索和Petapoco取得了很好的效果。安装后,它将整个数据访问业务转移到一边,而不需要任何实质性的学习投资,这与许多其他窗体不同。它们是免费使用的,我绝对推荐。

    桌子 -如果在业务类中检索后要组合的多组数据具有非常复杂的交互,则局部视图可能很有用。但是,如果您呈现的数据来自一个表,或者甚至接近作为查询结果的最终表单,则没有理由使用它们。相反,使用foreach循环迭代数据,并以此方式格式化HTML。

    像网格一样的表示方法非常简单。

    <% foreach (var row in Model.Rows) {%>
        [HTML for one row]
    <%}%>
    

    这甚至可以通过HTML表来实现,因为您提供了数据表。

    <table>
    <% foreach (var row in Model.Rows) {%>
        <tr>
            <td>row.Element1</td>
            <td>row.Element2</td>
            <td>row.Element3</td>
        </tr>
    <%}%>
    </table>
    

    栅格外观 -至于外观,例如根据内容对数据进行条带化或着色,将这些决策作为您发送的模型数据的一部分,并在视图中简单地使用CSS类来实现这一点。例如,您可以在Odd偶数字段中返回值“奇数”或“偶数”,这将是您可以在样式表中设置样式的CSS类。

    <table>
    <% foreach (var row in Model.Rows) {%>
        <tr class=<%=row.OddEven%>>
            <td>row.Element1</td>
            <td>row.Element2</td>
            <td>row.Element3</td>
        </tr>
    <%}%>
    </table>
    

    分选 -至于如何使用大量的jquery或javascript对数据进行排序和操作,我会等到遇到一些已知的性能问题后再一直担心重新加载数据。但是,如果每次重新加载数据,则可能会发现网格中的数据不断刷新,并且用户发现这些数据丢失了光标的位置,或者在编辑时被中断,或者更改会触发数据库中未完成编辑的事件。

    尽管看起来数据网格是按日期顺序排列的,并且有人更改了日期,但最重要的是立即使用数据。我并不声称了解您的情况,但经过多年的努力,我发现让用户完成他们的工作(例如,通过跳过该方法)通常更重要的是重新排列行,这通常意味着试图编辑的数据已跳到其他地方,他们必须再次找到它。

    一个引人注目的界面可能是,当数据元素发生变化时,保存会被发送到后台,但网格不会重新定位或使用。当然,下一次刷新页面时,会重新使用它,但不会在编辑会话期间使用。只是一个考虑的想法。

    客户端交互 -如果你的应用有很多用户和大量的编辑,如果你在每次编辑时刷新数据,大数据集会导致大量的流量。但是,如果这是一个内部应用程序,用户有限或活动有限,这当然不是一个问题。使用jquery编辑数据非常有效-您可以在编辑数据时添加调用来保存数据,这可以使应用程序具有传统Web应用程序所缺乏的可用性。

        2
  •  1
  •   Donald Byrd    16 年前

    我将考虑使用jqgrid(jquery grid插件)并实现内联编辑。创建控制器操作,将所需数据作为jsonresult返回。使用linq2sql或实体框架访问数据层。

    家: http://www.trirand.com/blog/

    演示: http://www.trirand.com/blog/jqgrid/jqgrid.html

        3
  •  1
  •   Rob West    16 年前

    MVC框架实际上并不支持一种数据访问方法而不是另一种。显然,MVC的一个主要优点是它改进了可测试性,因此以这样的方式构造代码是有意义的:控制器可以与单元测试的数据访问逻辑分离。实现这一点的最简单方法是通过存储库模式,您可以使用ADO.NET实现该模式。

    要呈现表格数据,最好在视图中使用foreach循环,而不是使用分部。如果存在复杂的逻辑,这可能会变得混乱,但可以通过使用HTML助手来清除。参见Rob Conery的优秀文章 avoiding tag soup 关于这方面的一些建议。

    我认为行编辑的最佳方法是让每行编辑对一个编辑操作发出一个Ajax请求,这样您就不需要刷新所有数据。当MVC无缝地处理动作参数的绑定时,这很容易做到。您可以为此采取特定的操作,将状态消息发送回用户反馈。我会为这个滚动您自己的功能,因为这很容易做到。

    对于刷新所有数据,我发现最简单的方法是使用bool?is partial参数在视图上,如果未定义或为false,则呈现完整视图;如果为true,则呈现部分视图。然后,您可以在第一次请求时正常调用相同的操作,然后在发出Ajax请求时通过ispartial=true发送。然后可以使用jquery将表的HTML更新为完整块。这比返回JSON和解析客户端更快。

    推荐文章