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
相关产品推荐
相关产品推荐

