#asp.net #asp.net-mvc #asynchronous #controller #modelstate
#asp.net #asp.net-mvc #асинхронный #контроллер #состояние модели
Вопрос:
Я пытаюсь использовать асинхронный контроллер и не могу понять, как можно проверить пользовательский ввод.
Ниже приведены два асинхронных метода, определенных в моем контроллере. Должен ли я проверять 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);
}
Ответ №1:
Кажется, у меня работает следующее. В конечном итоге я проверяю 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);
}
Ответ №2:
Вы можете использовать
AsyncManager.Parameters['ModelIsValid'] = false;
в асинхронном методе и
if(AsyncManager.Parameters['ModelIsValid'] == false) { ... }
в завершенном методе, чтобы проверить, была ли проблема с проверкой. Просто не увеличивайте количество невыполненных операций и не выполняйте никакой дальнейшей логики. Завершенный метод сработает, и вы сможете проверить значение.
Комментарии:
1. Я придумал ответ, который опубликовал ранее, хотя stackoverflow не позволил бы мне ввести его в течение 24 часов. Ваш ответ довольно близок к тому, что у меня было, поэтому отдам вам должное за это. Вы упомянули, что не увеличиваете невыполненные операции. Имеет ли это значение?
2. Завершенный метод не будет выполняться до тех пор, пока не будут завершены невыполненные операции, иначе = 0. Таким образом, если вы никогда не увеличиваете, вам никогда не понадобится уменьшать, и, следовательно, невыполненные операции останутся равными 0. Это позволяет выполнить завершенный метод. Не имеет значения, пока нет невыполненных операций.
3. Спасибо xixonia. Обновил мой ответ с учетом этого