2

非同期コントローラーを使用しようとしていますが、ユーザー入力を検証する方法がわかりません。

以下は、私のコントローラーで定義された 2 つの非同期メソッドです。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);
}
4

2 に答える 2

3

以下は私のために働くようです。どちらの方法でもモデル状態をチェックすることになります。初期モデルをパラメーターとして完成したメソッドに追加しました。Asp.net Mvc は、2 つのメソッド間でモデル状態を保持しているように見えました

    [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);
    }
于 2011-04-14T02:40:02.527 に答える
0

使用できます

AsyncManager.Parameters['ModelIsValid'] = false;

Asyncメソッドで、および

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

Completedメソッドで、検証の問題があったかどうかを確認します。単に未処理の操作をインクリメントしたり、それ以上のロジックを実行したりしないでください。Completedメソッドが起動し、値を確認できます。

于 2011-04-13T03:27:30.163 に答える