2011-04-13 37 views
2

我想使用异步控制器,我无法弄清楚如何验证用户输入。

以下是我的控制器中定义的两种异步方法。我应该在SearchAsync方法或SearchCompleted方法中检查ModelState.IsValid。如果SearchAsync那么它的返回类型是void将返回视图结果。如果SearchCompleted,那么该方法将如何知道searchForm参数。如何验证异步控制器中的模型状态

[HttpPost] 
[ValidateAntiForgeryToken] 
public void SearchAsync(BusinessSearchForm searchForm) 
{ 
    AsyncManager.OutstandingOperations.Increment(); 
    new Thread(() => 
    { 
     var suggestions = _searchSvc.GetSuggestions(searchForm.BusinessName, searchForm.StreetAddress, searchForm.City, searchForm.PostalCode); 
     AsyncManager.Parameters["suggestions"] = suggestions;     
     AsyncManager.OutstandingOperations.Decrement(); 
    }).Start(); 
} 

public ActionResult SearchCompleted(IEnumerable<BusinessSuggestionBase> suggestions) 
{ 
    return View(suggestions); 
} 

回答

3

以下似乎适用于我。我最终在两种方法中检查modelstate。将初始模型作为参数添加到完成的方法中。 Asp.net的mvc似乎坚持两种方法

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public void SearchAsync(BusinessSearchForm searchForm) 
    { 
     if (ModelState.IsValid) 
     { 
      AsyncManager.OutstandingOperations.Increment(); 
      new Thread(() => 
      { 
       if (ModelState.IsValid) 
       { 
        var suggestions = _searchBusinessSvc.GetSuggestions(searchForm.BusinessName, searchForm.StreetAddress, searchForm.City, searchForm.PostalCode); 
        AsyncManager.Parameters["suggestions"] = suggestions; 
       } 
       AsyncManager.Parameters["searchForm"] = searchForm; 
       AsyncManager.OutstandingOperations.Decrement(); 
      }).Start();    
     } 
    } 

    public ActionResult SearchCompleted(BusinessSearchForm searchForm,IEnumerable<BusinessSuggestionBase> suggestions) 
    { 
     if (ModelState.IsValid) 
     { 
      TempData["suggestions"] = suggestions; 
      return RedirectToAction("SearchResult"); 
     } 
     return View(searchForm); 
    } 
0

您可以使用

AsyncManager.Parameters['ModelIsValid'] = false; 
在异步方法

,并

if(AsyncManager.Parameters['ModelIsValid'] == false) { ... } 

在完成的方法来检查,看看是否有一个验证问题。不要增加未完成的操作,也不要执行更多的逻辑。 Completed方法将触发,并且您可以检查该值。

+0

我想出了我之前发布的计算器,虽然不会让我24小时内进入它的答案之间的ModelState。你的回答非常接近我所能提供的信息。你提到不增加未完成的操作。这有什么区别吗? – 2011-04-14 03:03:10

+0

Completed方法不会执行,直到未完成的操作完成,aka = 0。因此,如果您永远不会增加,您将永远不需要递减,因此未完成的操作保持为0.这允许执行Completed方法。没关系,只要没有突出的操作。 – 2011-04-14 05:08:26

+0

谢谢xixonia。考虑到此更新了我的答案 – 2011-04-14 12:41:13