2009-08-09 48 views
1

我希望能够在启动长时间运行的异步任务之前检查表单输入。ASP.net MVC期货AsyncController:处理服务器验证

  1. 校验值的Begin方法和 抛出一个异常:

    两个我想到的办法?

  2. 发布到正常验证的正常(同步方法)。如果没有发现错误,则重定向到asynchonrous方法。

抛出异常我认为是一个简单的解决方案。我无法从begin方法返回视图,因此异常在end方法上处理。只有它没有达到最后的方法(我认为这是正常模式)

验证在一个正常的同步方法是好的......但我如何传输或重定向请求到异步方法? ?

+0

你能澄清你正在使用的异步方法呢? (即,IAsyncResult模式,事件模式或委托模式)。请参阅此处获取更多信息:http://blog.maartenballiauw.be/post/2009/04/08/Using-the-ASPNET-MVC-Futures-AsyncController.aspx – 2009-08-10 01:54:58

+0

为什么你会遇到异常?你有没有读过这个:http://stackoverflow.com/questions/77127/when-to-throw-an-exception – 2009-12-21 09:53:30

回答

1

你不需要使用异常或同步方法,你可以传回一个不同的IAsyncResult(假设你使用的模式 - 如果你使用事件或委托模式,你仍然可以能够无例外地实现类似的目标)。

下面是该在这里我们使用一个虚拟的委托返回,如果有一个错误(在这种情况下无效的ID),一个简单的例子:

public class MyAsyncController : AsyncController 
{ 
    public IAsyncResult BeginFoo(int id, AsyncCallback callback, object state) 
    { 
     Action errorDelegate =() => ViewData["errors"] = "Invalid ID"; 
     // Here's our validation check, return the error delegate if necessary 
     if (id <= 0) return errorDelegate.BeginInvoke(callback, state); 

     var webRequest = WebRequest.Create("http://www.apple.com"); 
     return webRequest.BeginGetResponse(callback, webRequest); 
    } 

    public ActionResult EndFoo(IAsyncResult asyncResult) 
    { 
     if (asyncResult.AsyncState is WebRequest) 
     { 
      var webRequest = (WebRequest) asyncResult.AsyncState; 
      var httpResponse = (HttpWebResponse) webRequest.EndGetResponse(asyncResult); 
      ViewData["status"] = httpResponse.StatusCode; 
     } 
     return View(); 
    } 
}