当前位置:首页 > 技术 > 正文内容

ASP.NET MVC 与 jQuery 的异步通信实践

访客 技术 2026年8月10日 1

在 ASP.NET MVC 架构中,前端通过 jQuery 实现与后端的高效异步交互,是构建响应式 Web 应用的关键环节。以下展示五种典型场景下的实现方式,涵盖表单提交、数据查询、删除操作及列表渲染等常见需求。

1. 表单异步提交(基于 ajaxForm)

使用 ajaxForm 插件替代原生提交,避免页面刷新:

if ($('#userForm').valid()) {
    $('#userForm').ajaxForm({
        success: function (response) {
            if (response.code === 200) {
                layer.msg('操作成功', { icon: 1 });
                setTimeout(() => {
                    const iframeIndex = parent.layer.getFrameIndex(window.name);
                    parent.location.reload();
                    parent.layer.close(iframeIndex);
                }, 800);
            } else {
                layer.msg(response.message || '操作失败', { icon: 2 });
            }
        },
        error: () => layer.msg('网络异常,请重试', { icon: 0 })
    });
}

对应控制器方法返回标准化 JSON 响应:

[HttpPost]
public JsonResult UpdateUserProfile(UserProfileDto dto)
{
    var result = _userService.Save(dto);
    return Json(new { code = result ? 200 : 500, message = result ? "更新成功" : "保存失败" });
}

2. GET 请求获取单条记录(带参数)

通过 URL 参数传递 ID,获取用户详情:

$.get('/api/user/detail', { userId: 123 }, function (res) {
    if (res && res.data) {
        $('#userName').text(res.data.fullName);
        $('#email').val(res.data.email);
    }
});

后端采用 JsonResult 并启用跨请求访问支持:

[HttpGet]
public JsonResult Detail(int userId)
{
    var user = _userRepository.FindById(userId);
    return Json(new { data = user }, JsonRequestBehavior.AllowGet);
}

3. POST 请求执行删除操作(含错误处理)

封装结构化请求,统一处理响应逻辑:

$.ajax({
    url: '/api/user/remove',
    type: 'POST',
    data: { id: targetId, operator: 'admin' },
    dataType: 'json',
    timeout: 5000,
    success: function (resp) {
        if (resp.success) {
            $(`tr[data-id="${targetId}"]`).fadeOut(300, function () { $(this).remove(); });
        } else {
            layer.alert(resp.error || '删除失败');
        }
    },
    error: function (xhr) {
        if (xhr.status === 0) {
            layer.msg('网络中断');
        } else if (xhr.status === 401) {
            layer.msg('未授权访问');
        }
    }
});

控制器返回语义化结果对象:

[HttpPost]
public JsonResult Remove(int id, string operator)
{
    try
    {
        var deleted = _userService.Delete(id, operator);
        return Json(new { success = deleted, error = deleted ? null : "删除失败" });
    }
    catch (Exception ex)
    {
        return Json(new { success = false, error = ex.Message });
    }
}

4. 简化 POST 调用($.post)

适用于轻量级操作,如状态切换或简单删除:

$.post('/api/user/toggle-status', { id: itemId, status: 1 }, function (result) {
    if (result > 0) {
        $(`#status-${itemId}`).text('已启用').removeClass('disabled');
    } else {
        layer.msg('状态更新失败');
    }
});

后端直接返回整型状态码(兼容旧式习惯):

[HttpPost]
public int ToggleStatus(int id, int status)
{
    return _userService.ChangeStatus(id, status) ? 1 : 0;
}

5. 动态加载表格数据(GET + JSON List)

结合 Razor URL 辅助方法生成安全路由,并渲染模板:

$.get('@Url.Action("List", "User")', { category: 'active' }, function (users) {
    const tbody = $('#userTable tbody').empty();
    users.forEach(u => {
        tbody.append(`
            <tr data-id="${u.id}">
                <td>${u.name}</td>
                <td>${u.email}</td>
                <td>${u.isActive ? '✅' : '❌'}</td>
                <td><button class="btn-delete" data-id="${u.id}">删除</button></td>
            </tr>
        `);
    });
}, 'json');

服务端投影 DTO 并过滤敏感字段:

[HttpGet]
public JsonResult List(string category)
{
    var query = _userService.GetByCategory(category);
    var dtos = query.Select(x => new UserSummaryDto
    {
        Id = x.Id,
        Name = x.FullName,
        Email = x.EmailAddress,
        IsActive = x.Enabled,
        LastLogin = x.LastLoginTime?.ToString("yyyy-MM-dd HH:mm")
    }).ToList();

    return Json(dtos, JsonRequestBehavior.AllowGet);
}
标签: asp.net-mvc

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。