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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:36:04