2 Stimmen

Validierung des Modellzustands in einem asynchronen Controller

Ich versuche, Async-Controller zu verwenden und bin nicht in der Lage, herauszufinden, wie würde man die Benutzereingabe validieren.

Im Folgenden sind die beiden asynchronen Methoden in meinem Controller definiert. Sollte ich für ModelState.IsValid in der SearchAsync-Methode oder SearchCompleted-Methode überprüfen. Wenn SearchAsync dann wie wird die Ansicht Ergebnis zurückkehren, wie seine Rückgabetyp ist void. Wenn SearchCompleted dann wie wird die Methode über searchForm Parameter wissen.

[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);
}

3voto

Anil Ali Punkte 478

Das Folgende scheint bei mir zu funktionieren. Ich am Ende für modelstate in beiden Methoden zu überprüfen. Fügte das ursprüngliche Modell als Parameter für die Methode abgeschlossen. Asp.net Mvc schien den Modelstate zwischen den beiden Methoden zu erhalten

    [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);
    }

0voto

cwharris Punkte 17356

Sie können verwenden

AsyncManager.Parameters['ModelIsValid'] = false;

in der Async-Methode, und

if(AsyncManager.Parameters['ModelIsValid'] == false) { ... }

in der Completed-Methode, um zu prüfen, ob es ein Validierungsproblem gab. Erhöhen Sie einfach nicht die ausstehenden Vorgänge und führen Sie keine weitere Logik aus. Die Methode Completed wird ausgelöst, und Sie können den Wert überprüfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X