2014-03-12 28 views
-2

不能弄明白: 有这个(我已经删除了大部分代码,以方便阅读)MVC TempData的不异步方法保存

[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 [“文本”]

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

+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"; 
      } 
     }); 
} 

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

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

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

     }); 
} 

你可以找到关于使用异步方法here您正在使用什么版本的ASP.NET MVC的