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

ASP.NET Core Razor视图如何更新ViewData,PartialView返回内容不显示如何解决

问题核心原因

不管是最开始用ViewData的方案,还是后来改成PartialView的方案,内容不展示的核心原因都是:AJAX请求从后端拿到返回结果后,你没有编写代码将结果更新到页面的对应区域,浏览器不会自动替换页面内容。

另外首次渲染页面时,你直接引用<partial name="_ReplyPartial">没有传入Model,初始状态本身就是空内容,后端返回的Partial内容也不会自动替换掉这部分初始内容。

修正步骤(PartialView方案)

1. 给Partial区域加可定位的容器

修改Dependencies.cshtml里的Partial引用代码,用带ID的div包裹,方便后续JS定位更新:

<!-- 把原来的 <partial name="_ReplyPartial"> 替换成下面的代码 -->
<div id="replyContainer">
    <partial name="_ReplyPartial">
</div>

2. 补全AJAX的成功回调逻辑

修改Dependencies.cshtml里的脚本代码,拿到后端返回的Partial渲染后的HTML后,直接替换容器内的内容:

$('#createBlob').on('click', () => {
    $.ajax({
        url: '?handler=CreateBlob',
        // 新增成功回调处理返回结果
        success: function (partialHtml) {
            $('#replyContainer').html(partialHtml);
        }
    });
});

补充说明(原始ViewData方案问题)

原始用ViewData的方案本身逻辑就不成立:

  • ViewData的生命周期仅存在于单次请求内,AJAX调用OnGetCreateBlob时填充的ViewData,在请求结束就销毁了,你刷新页面是发起新请求,自然拿不到之前的值
  • 如果不想用PartialView,也可以让接口直接返回字符串内容,AJAX拿到后直接赋值给对应区域即可:
    // Site.cshtml.cs 调整方法返回值
    public IActionResult OnGetCreateBlob()
    {
        var response = _client.PutAsync(url, new StringContent(DateTime.UtcNow.ToString())).Result;
        var reply = $"StatusCode: {(int)response.StatusCode}";
        return Content(reply);
    }
    
    // 前端AJAX逻辑
    $.ajax({
        url: '?handler=CreateBlob',
        success: function (reply) {
            $('#response').text(reply);
        }
    });
    

额外优化建议

不要用.Result同步等待异步方法,很容易引发线程死锁,建议改成async/await的异步写法:

public async Task<PartialViewResult> OnGetCreateBlobAsync()
{
    var response = await _client.PutAsync(url, new StringContent(DateTime.UtcNow.ToString()));     
    var reply = $"StatusCode: {(int)response.StatusCode}";
    return Partial("_ReplyPartial", reply);
}

内容的提问来源于stack exchange,提问作者Matthias Güntert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:45:02