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 似乎保留了两种方法之间的模型状态

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

在异步方法中,和

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

在 Completed 方法中检查是否存在验证问题。简单地不要增加未完成的操作,也不要执行任何进一步的逻辑。Completed 方法将触发,您可以检查该值。

于 2011-04-13T03:27:30.163 回答