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

MVC5中如何顺序执行C#代码并在程序运行时分步向视图输出数据

解决方案

实现原理

ASP.NET MVC默认的服务端渲染逻辑是:控制器的所有业务逻辑执行完成后才会开始渲染视图,视图渲染完毕后才会将完整的HTML响应返回给浏览器,因此你原来的写法不可能实现分步渲染输出,必须采用前端异步请求+服务端接口拆分的方案实现需求。

第一步:调整控制器代码

将原有逻辑拆分为两个接口:第一个接口仅返回初始页面,输出查询开始时间,不执行耗时查询;第二个接口负责执行存储过程查询,返回JSON格式的结果和查询结束时间。

// 初始页面加载接口
public IActionResult GetQuery()
{
    ViewData["Timefrom"] = DateTime.Now;
    return View();
}

// 异步查询执行接口
public IActionResult ExecuteQuery()
{
    // 已修复你原有代码中FromSqlRaw缺少闭合括号的语法错误
    var query = _context.Order.FromSqlRaw("EXECUTE [dbo].[GetStatusReport]").ToList();
    return Json(new {
        EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
        Result = query
    });
}

第二步:调整视图代码

删除原有视图的强类型Model绑定,页面首次加载时直接渲染开始时间和加载提示,页面加载完成后自动发起异步请求调用查询接口,请求返回后隐藏加载提示、渲染查询结果、显示结束时间。

@{
  ViewData["Title"] = "Home Page";
  var startTime = ViewData["Timefrom"] as DateTime? ?? DateTime.Now;
}

<!-- 页面加载时直接显示开始时间 -->
<div>Start Time: @startTime.ToString("yyyy-MM-dd HH:mm:ss")</div>

<!-- 默认显示的加载提示 -->
<div id="loadingTip">*查询正在执行,请稍候...</div>

<!-- 查询结果表格,默认隐藏 -->
<table style="display:none;" id="resultTable">
  <thead>
    <tr>
      <th width="30%">订单ID</th>
      <th width="30%">名称</th>
      <th width="30%">位置</th>
    </tr>
  </thead>
  <tbody id="resultBody">
  </tbody>
</table>

<!-- 结束时间容器,默认隐藏 -->
<div id="endTimeContainer" style="display:none;">End Time: <span id="endTime"></span></div>

<script>
// 若你的项目未使用jQuery,可替换为原生fetch API实现异步请求
$(function(){
    $.ajax({
        url: '@Url.Action("ExecuteQuery")',
        type: 'GET',
        success: function(res){
            // 隐藏加载提示
            $('#loadingTip').hide();
            // 拼接结果表格HTML
            let html = '';
            res.Result.forEach(item => {
                html += `<tr>
                    <td width="30%">${item.orderId}</td>
                    <td width="30%">${item.name}</td>
                    <td width="30%">${item.location}</td>
                </tr>`;
            });
            $('#resultBody').html(html);
            // 显示表格和结束时间
            $('#resultTable').show();
            $('#endTime').text(res.EndTime);
            $('#endTimeContainer').show();
        },
        error: () => {
            $('#loadingTip').text('查询执行失败,请刷新重试');
        }
    });
});
</script>

补充说明

  • 如果你的项目还没有引入jQuery,可使用项目本地的jQuery资源,或者改用原生fetch API实现异步请求
  • .NET Core默认的System.Text.Json序列化会将属性名转为驼峰格式,如果前端取不到对应字段,可以在浏览器控制台打印返回结果确认实际字段名
  • 若查询返回的数据量较大,建议增加分页逻辑优化加载体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:24:03