如何验证异步控制器中的模型状态
问题描述:
我想使用异步控制器,我无法弄清楚如何验证用户输入。
以下是我的控制器中定义的两种异步方法。我应该在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);
}
答
以下似乎适用于我。我最终在两种方法中检查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);
}
答
您可以使用
AsyncManager.Parameters['ModelIsValid'] = false;
在异步方法
,并
if(AsyncManager.Parameters['ModelIsValid'] == false) { ... }
在完成的方法来检查,看看是否有一个验证问题。不要增加未完成的操作,也不要执行更多的逻辑。 Completed方法将触发,并且您可以检查该值。
我想出了我之前发布的计算器,虽然不会让我24小时内进入它的答案之间的ModelState。你的回答非常接近我所能提供的信息。你提到不增加未完成的操作。这有什么区别吗? – 2011-04-14 03:03:10
Completed方法不会执行,直到未完成的操作完成,aka = 0。因此,如果您永远不会增加,您将永远不需要递减,因此未完成的操作保持为0.这允许执行Completed方法。没关系,只要没有突出的操作。 – 2011-04-14 05:08:26
谢谢xixonia。考虑到此更新了我的答案 – 2011-04-14 12:41:13