如何在不调用控制器的情况下刷新 MVC webgrid

Posted

技术标签:

【中文标题】如何在不调用控制器的情况下刷新 MVC webgrid【英文标题】:How to refresh a MVC webgrid without calling the controller 【发布时间】:2015-10-28 08:52:42 【问题描述】:

在页面加载时,我的模型通过机器的事件日志列表传入。我声明了一个列表,然后用这些日志填充它。

private List<machine_log> _logObjList = new List<machine_log>();

通过这个填满:

@helper FillLogMainList()

    foreach (IQueryable<machine_log> logType in Model.MachineLogs)
    
        foreach (var log in logType)
        
            _logObjList.Add(log);
        
    

这些日志可以有 6 种不同的类型。应用程序、系统、安全等。我只想在 webgrid 中显示一种类型。我现在可以做到。当我已经加载说“应用程序日志”但我想单击“安全日志”按钮现在使用我已经拥有的 _logObjList 列表中的安全类型日志填充网格时,问题就出现了。

当我第一次打开页面时,默认的“应用程序日志”会通过这个函数填充,我将“应用程序”作为类型字符串传入:

@helper FillLogList(string type)

    _logs.Clear();
    foreach (var log in _logObjList)
    
        if (log.log_type == type)
        
            string entry = "";
            if (log.entry_type == "Warning ")
            
                entry = "http://trycatchgaming.com/temp/warning.png";
            
            else
            
                entry = "http://trycatchgaming.com/temp/error.png";
            
            var newLine = new SingleLog
            
                EntryType = entry,
                Message = log.event_id + "#" + log.message,
                Source = log.source,
                EventId = log.event_id,
                LogId = log.id,
                EntryTime = log.entry_time
            ;
            _logs.Add(newLine);
        
    

现在我有一个用于填充 webgrid 的 _logs 列表,它是 div 内页面的正常“主体”的一部分:

<div id="grid" style="padding: 0; overflow-y: scroll; height: 500px; width: 100%">
                @obj = new WebGrid(source: _logs, defaultSort: "EntryTime", ajaxUpdateContainerId: "grid", rowsPerPage: 200000);

                @obj.Gethtml(
                    tableStyle: "webgrid-table",
                    htmlAttributes: new  id = "MainTable" ,
                    headerStyle: "webgrid-header",
                    //footerStyle: "webgrid-footer",
                    alternatingRowStyle: "webgrid-alternating-row",
                    selectedRowStyle: "webgrid-selected-row",
                    rowStyle: "webgrid-row-style",
                    //mode: WebGridPagerModes.All,
                    columns: obj.Columns(
                        obj.Column(columnName: "EntryType", header: "Event Type", format:@<img src="@item.EntryType" />),
                        obj.Column(columnName: "EntryTime", header: "Event Time"),
                        obj.Column(columnName: "Source", header: "Source"),
                        obj.Column(columnName: "EventId", header: "Event Id"),
                        obj.Column(columnName: "LogId", header: "Log Id"),
                        obj.Column(header: "All", style: "labelcolumn", format: @<text><input class="check-box" tag="check-box" id="assignChkBx" name="Message" type="checkbox" value="@item.Message" /></text>)
                        )
                    )
            </div>

所以,我的问题归结为,我知道如何清除并制作新的日志列表和所有内容,但我不知道如何将其应用于网格。理想情况下,我可以清除日志列表,使用安全日志填充它,然后刷新网格,现在将填充安全日志。洗涤漂洗重复。

但是,似乎没有任何内置方法可以以这种方式处理数据。我能找到的所有示例都希望我回到控制器,获取更多数据并通过一些局部视图重新填充网格。但是,我已经拥有所有数据,并且我希望不必为了获取我已经拥有的数据而进行额外的查询和加载。

【问题讨论】:

【参考方案1】:

为每种类型制作单独的网格。然后单击该类型的按钮在网格上填充适当的类型数据。并跟踪加载的类型。如果单击其他类型按钮,则隐藏上一个网格并在另一个网格中加载新类型数据。这减少了数据负载。

【讨论】:

以上是关于如何在不调用控制器的情况下刷新 MVC webgrid的主要内容,如果未能解决你的问题,请参考以下文章

如何在不刷新的情况下使用Ajax在ASP.NET MVC中保存表单数据

如何在不影响刷新控制功能的情况下禁用 collectionview 弹跳效果?

如何在 c# mvc 中自动刷新 jqgrid

如何在不使用某些框架的情况下在 php 中进行 MVC

在 ASP.NET MVC 中过期后刷新访问令牌

如何在不破坏 CakePHP 中的 MVC 框架的情况下做到这一点?