как проверить 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 2

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) { ... }

В завершенном методе, чтобы проверить и посмотреть, была ли проблема проверки. Просто не увеличивайте выдающиеся операции и не выполняйте никакой дальнейшей логики. Завершенный метод сработает, и вы можете проверить значение.