You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC控制器仅显示PartialView 按钮无法触发GetUpdateTable问题

问题根因与修复方案

现存问题根因

  1. 按钮点击无响应、仅首次加载触发更新
    • Hub端UpdateTable错误定义为静态方法,且未接收前端传入的比赛名参数,仅在Hub启动完成时被主动调用1次,没有和页面按钮的点击事件做任何绑定
    • 客户端没有给触发按钮绑定点击后调用Hub方法的逻辑,后续操作自然不会触发刷新推送
  2. 单元格着色失效、仅加载PartialView裸内容
    • AJAX请求的contentType配置格式错误(多了冗余空格、写错了编码声明格式),导致返回的PartialView渲染时样式上下文丢失
    • 如果单元格着色依赖前端JS逻辑,DOM被替换后没有重新执行着色方法,样式不会生效
    • 跨上下文用ViewBag传递表格渲染内容时,没有和PartialView的渲染逻辑做绑定,着色相关的DOM属性丢失

修复后代码

Hub层代码

[HubName("ShowMatchHub")]
public class ShowMatchHub : Hub
{
    [HubMethodName("UpdateTable")]
    // 不要用静态方法,Hub实例可直接访问Clients属性,无需手动获取HubContext
    public void UpdateTable(string matchName)
    {
        // 直接向所有客户端推送刷新事件,附带比赛名参数,避免客户端重复解析URL
        Clients.All.GetUpdateTable(matchName);
    }
}

Controller层代码

public ActionResult GetUpdateTable(string Name)
{
    if (string.IsNullOrWhiteSpace(Name))
        return new HttpStatusCodeResult(400, "比赛名称不能为空");
    
    Match match = db.Matches.FirstOrDefault(c => c.Name.Equals(Name));
    if (match == null)
        return HttpNotFound("指定比赛不存在");
    
    match = match.GetMatch(match, db);
    // 表格着色逻辑直接在DrawTable方法中生成带样式的HTML,和PartialView模型绑定
    ViewBag.TableContent = match.DrawTable(match);
    return PartialView("_GamePartial", match);
}

前端SignalR与交互代码

$(function () {
    var showMatchHub = $.connection.ShowMatchHub;

    // 注册客户端接收刷新事件的方法
    showMatchHub.client.GetUpdateTable = function (matchName) {
        loadMatchTable(matchName);
    };

    // Hub连接完成后初始化逻辑
    $.connection.hub.start().done(function () {
        var initMatchName = getUrlParameter("Name");
        // 首次进入页面加载表格
        loadMatchTable(initMatchName);

        // 绑定刷新按钮点击事件:将选择器替换为你页面上实际的按钮ID/类
        $("#refreshTableBtn").on("click", function () {
            var currentMatchName = getUrlParameter("Name");
            showMatchHub.server.UpdateTable(currentMatchName);
        });
    });

    // URL参数解析方法(保留原有逻辑即可)
    function getUrlParameter(sParam) {
        var sPageURL = window.location.search.substring(1),
            sURLVariables = sPageURL.split('&'),
            sParameterName, i;
        for (i = 0; i < sURLVariables.length; i++) {
            sParameterName = sURLVariables[i].split('=');
            if (sParameterName[0] === sParam) {
                return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
            }
        }
        return false;
    }

    // 加载表格内容的统一方法
    function loadMatchTable(matchName) {
        var $container = $('#tableModel');
        $.ajax({
            url: '/Manage/GetUpdateTable',
            type: 'GET',
            data: { Name: matchName }, // 用data字段传参,不要手动拼接URL避免编码问题
            dataType: 'html',
            // 删除错误的contentType配置,GET请求无需手动声明HTML类型的contentType
            success: function (result) {
                $container.empty().append(result);
                // 如果单元格着色是前端JS实现,在这里重新执行着色方法即可
                // 例:applyTableCellStyle();
            },
            error: function (err) {
                console.error("表格加载失败", err);
            }
        });
    }
});

注意事项

  • 将代码中#refreshTableBtn替换为你页面上实际用来触发刷新的按钮选择器
  • 如果单元格着色逻辑是前端JS实现,必须在AJAX加载完PartialView、DOM插入完成后重新执行着色方法,因为容器被清空后原有DOM上绑定的样式、事件都会被移除
  • 只有在Hub类外部的其他组件调用SignalR推送时,才需要用GlobalHost.ConnectionManager.GetHubContext获取上下文,Hub内部实例方法直接用自带的Clients属性即可

内容的提问来源于stack exchange,提问作者Sebastiano Bortoletti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 23:18:26