ASP.NET中如何将异步子操作的返回值无异常传递到视图
问题根因
- ASP.NET MVC 原生的
Html.Action是同步调用方法,无法正确处理返回Task<T>的异步子操作,你拿到的返回值实际是未执行的Task对象,而非预期的bool结果 - 原有代码里直接对
Session["ticketKey"]调用ToString存在空引用风险,且Razor中通过字符串和布尔值比对的写法逻辑错误
修复方案
方案1:使用异步调用方法直接取值(推荐)
ASP.NET MVC 5及以上版本提供了异步子操作调用方法Html.ActionAsync,直接在Razor中await即可拿到真实返回值:
控制器代码修正(修复空引用异常)
[HttpGet] [ChildActionOnly] public async Task<bool> ValidateCurrentUser() { bool result = false; try { // 先判Session是否为空,避免空引用异常 if (Session["ticketKey"] == null || string.IsNullOrEmpty(Session["ticketKey"].ToString())) { return result; } string ticket = Session["ticketKey"].ToString(); result = await _authenticationService.ValidateUser(ticket); return result; } catch (Exception) { return result; } }
Razor页面代码修正
@{ // 等待异步操作完成,直接取值 bool isvalid = await Html.ActionAsync("ValidateCurrentUser", "Authentication") as bool? ?? false; if (isvalid) { <div> RED </div> } else { <div> BLUE </div> } }
方案2:改异步子操作为同步实现
如果项目版本不支持ActionAsync,可以直接把校验逻辑改成同步实现,原有Html.Action即可正常读取返回值:
[HttpGet] [ChildActionOnly] public bool ValidateCurrentUser() { bool result = false; try { if (Session["ticketKey"] == null || string.IsNullOrEmpty(Session["ticketKey"].ToString())) { return result; } string ticket = Session["ticketKey"].ToString(); // 同步等待校验结果 result = _authenticationService.ValidateUser(ticket).GetAwaiter().GetResult(); return result; } catch (Exception) { return result; } }
Razor页同步调用写法:
@{ bool isvalid = (bool)Html.Action("ValidateCurrentUser", "Authentication"); // 后续渲染逻辑不变 }
内容的提问来源于stack exchange,提问作者Ahune ajé o ahe
相关产品推荐
相关产品推荐

