как проверить modelstate в асинхронном контроллере
Я пытаюсь использовать асинхронный контроллер и не могу понять, как можно проверить пользовательский ввод.
Ниже приведены два асинхронных метода, определенные в моем контроллере. Должен ли я проверить ModelState.Метода IsValid метод SearchAsync или способ SearchCompleted. Если 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);
}
2 ответа:
Следующее, кажется, работает для меня. В итоге я проверяю modelstate в обоих методах. Добавлена исходная модель в качестве парама к завершенному методу. Asp.net Mvc, казалось, сохранял modelstate между двумя методами
[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) { ... }
В завершенном методе, чтобы проверить и посмотреть, была ли проблема проверки. Просто не увеличивайте выдающиеся операции и не выполняйте никакой дальнейшей логики. Завершенный метод сработает, и вы можете проверить значение.