MVC TempData不会保存在异步方法中

时间:2014-03-12 12:24:12

标签: asp.net-mvc model-view-controller async-await

无法弄清楚: 有这个。(我删除了大部分代码以简化阅读)

  [HttpPost]
    public  ActionResult Upload(HttpPostedFileBase file)
    {

        Change();

        return RedirectToAction("Index");            
    }

public ActionResult Index()
    {

        return View();
    }
 private async void Change()
    {
        await Task.Run(() =>
            {                    
                try
                {                       
                    TempData["Text"] = "Text 1";

                }
                catch 
                {
                    TempData["Text"] = "Text 2";
                }

            });

查看 @TempData [ “文本”]

我需要改变它,但它不会改变。需要一些帮助或其他方法(我只需根据“更改”功能中的条件更改文本并将其显示给用户)。 谢谢!

1 个答案:

答案 0 :(得分:0)

async void表示该方法为fire-and-forget。当您尝试设置TempData时,控制器不会等待它完成,响应已经被发送回客户端。

假设您使用的是ASP.NET MVC 4或更高版本,则必须将Change的签名更改为async Task并使您的操作异步:

[HttpPost]
public  async Task<ActionResult> UploadAsync(HttpPostedFileBase file)
{

    await Change();

    return RedirectToAction("Index");            
}

private async Task Change()
{
    await Task.Run(() =>
        {                    
            try
            {                       
                TempData["Text"] = "Text 1";

            }
            catch 
            {
                TempData["Text"] = "Text 2";
            }
        });
}

实际上,如果它只是调用Task.Run,​​则没有理由在async/await中使用Change。你可以写:

private Task Change()
{
    return Task.Run(() =>
        {                    
            try
            {                       
                TempData["Text"] = "Text 1";

            }
            catch 
            {
                TempData["Text"] = "Text 2";
            }

        });
}

您可以找到有关使用异步方法here

的完整教程