【问题标题】:How to edit tabular data (ASP MVC)如何编辑表格数据(ASP MVC)
【发布时间】:2016-09-25 17:14:08
【问题描述】:

我需要能够在浏览器中编辑数据表。

我在 MVCContrib 中看到有一个 HTML 助手来渲染一个表格。有用...但是如果我希望用户能够编辑该表呢?据我所知,它在那里没有帮助。

解决这个问题的最佳方法是什么?

传统的 FORM 里面有一个 TABLE?如果是这样,MVC 是否足够聪明,可以将发布的数据解析回行集合?无论如何,这将如何运作?

或者也许它应该在单击一行时切换到编辑模式(使用 javascript 等),然后当用户移动到另一行时,调用 AJAX 操作以仅提交一行。我可以想象这里的逻辑可能会变得复杂 - 这可能仍然使用表单,但我必须将它动态插入到 DOM 中吗?

我还需要能够向此表添加行。我不需要分页支持。

有现成的解决方案吗?

我应该回到网络表单吗? :)

【问题讨论】:

标签: asp.net-mvc html-table


【解决方案1】:

查看 Phil Haack 的博客,他在其中描述了如何model bind to a list

也许这有帮助?

【讨论】:

  • 有趣的文章。显示潜力,但声称已过时。这也是一个低级的解决方案 - 我希望有更多的收缩包装
  • 这个使用jQGrid的解决方案怎么样:ericdotnet.wordpress.com/2009/05/02/…
  • 据我所知,我不会接受这个作为答案。我的错误是认为任何复杂的 UI 都可以在 Web 上完成,而不是 hack! HTML 从来都不是为此而设计的……
【解决方案2】:

我遇到了同样的问题,我已经找到了解决方案。不要认为它是最漂亮的,但它对我来说很理想,因为我的要求之一是能够使用 jQuery 的Jeditable 插件编辑表格数据。

所以我使用 MVCContrib 的 Grid 扩展生成了一个表:

Html.Grid<Somenamespace.Line>( Model.InvoiceLines )
           .Attributes( id => "InvoiceGrid" )
           .Columns( column => {
               column.For( li => li.LineItem.ItemDescription ).Attributes( name => ".LineItem.ItemDescription", @class => "click" );
               column.For( li => li.LineItem.InvoiceUnitNetPrice ).Named( "Unit net price " ).Attributes( name => ".LineItem.InvoiceUnitNetPrice", @class => "click" );
               column.For( li => li.LineItem.InvoiceQuantity ).Attributes( name => ".LineItem.InvoiceQuantity", @class => "click" );
           })
           .Render();  
//rest of the code
Html.Submit("_submit", "Save");

现在你可以就地编辑值,但它不会升级相应的模型。 用户点击提交按钮后,所有的魔法都会发生:

$(document).ready(function() {
        $('#_submit').click(function(e) {
                e.preventDefault();
                $('#InvoiceGrid tbody tr').each(function(index) {
                    var hidden = $('<input />').attr({ type: 'hidden', name: 'InvoiceLines.Index', value: index });
                    $(this).children('td:first-child').before(hidden);
                    $(this).children('td:not(:first-child)').each(function() {
                        $(this).append($('<input />').attr({ type: 'hidden', value: $(this).text(), name: 'InvoiceLines[' + index + ']' + $(this).attr('name') }));
                    });
                });
                $('form').submit();
            });

            //editable stuff            
            $('.click').editable(function(value, settings) {
                return (value);
            }, { submit: 'OK' });
        });

在每个 TD 中,我使用来自该 TD 的值创建隐藏输入,在带有索引的每一行输入中,这里最重要的是“名称”属性:模型中集合的名称[这里是索引].rest .of.path,所以在这种特殊情况下(示例):

InvoiceLines[2].LineItem.ItemDescription

希望它会有所帮助,因为丰富的网格并不总是一个答案;)

问候 马特乌斯

【讨论】:

    【解决方案3】:

    我会先检查其中一个 javascript UI 库:

    在快速开发丰富的 UI (如可编辑网格)时,WebForms 更容易。

    【讨论】:

    • 谢谢。 Flexigrid 似乎还不支持编辑。 Yahoo DataTable 看起来很基本,这很好,但我看不到您如何保存数据。 ExtJs - 我刚刚发现了这个。看起来不错(复杂?)。现在调查
    【解决方案4】:

    昨晚我实现了一个简单的解决方案:内部表格+表格,使用单元格中的输入字段,命名约定如Phil Haack's blog中所述(感谢@BengtBe提供链接)。

    它可以工作,但有点繁琐(例如,使用 jquery 添加行需要我计算出下一个未使用的索引)。

    所以我还在寻找更多的解决方案。

    我发现的一个是extjs library,它提供了一个非常丰富的网格。我还没有弄清楚是否有一种简单的方法可以将网格数据回发到我的控制器操作之一...

    【讨论】:

      猜你喜欢
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多