2011-04-13 78 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