为什么MVC Post(ViewModel)不会使用Async返回更新的表单?

时间:2014-11-25 01:04:00

标签: asp.net-mvc asp.net-mvc-4 c#-4.0 asynchronous viewmodel

这是控制器:

    [HttpPost]
    public async Task<ActionResult> Index(EmailService em)
    {

        if (ModelState.IsValid)
        {
            await em.Send();

        }
        return View(em);
    }

这是ViewModel发送;其中“this”是EmailService类的一个实例。

public async Task<EmailService> Send()
{
    msg = new MailMessage(From, To);
    msg.Body = Body;
    msg.Subject = Subject;
    SetHost();

    try
    {
        await Server.SendMailAsync(msg);
        status = Status.Success;
        Sent = DateTime.Now;
        return this;
    }
    catch (Exception iox)
    {
        status = Status.Failed;
        IOX = iox;
        return this;
    }
}

我在控制器中设置了一个断点,并且看到状态正确更新,这意味着数据“正好在视图中,因为它应该是”:“em”确实包含了数据!在这个声明中。

 return View(em);

但是这个观点在发布之前仍处于同一状态?注意时间戳和它下面的字段?

enter image description here

调试数据包的时间,通过在帖子上的浏览器上按F12,并在输入控制器时设置断点,这样它就不会响应...这是入站数据:

To:somebody@email.com
From:somebody@email.com
Subject:This is a test
Body:This is only a test
Sent:1/1/0001 12:00:00 AM
status:Initialized

这是“em”的值,在控制器的返回视图(em)上设置中断:

To:somebody@email.com
From:somebody@email.com
Subject:This is a test
Body:"This is only a test"  string
Sent:{11/24/2014 6:48:49 PM}
status:Success

观看来自浏览器F12的200响应网络侧显示了这个“旧”表单数据!

To:somebody@email.com
From:somebody@email.com
Subject:This is a test
Body:This is only a test
Sent:1/1/0001 12:00:00 AM
status:Initialized

任何帮助都会受到赞赏,看起来MVC拉回了错误的副本,在Asynch控制器方法返回后返回!

1 个答案:

答案 0 :(得分:3)

因为当您返回视图时,html帮助器会根据ModelState中的值设置控件的值,而不是模型中的值。在this answer

中解释了这种行为的原因

为了呈现更新的SentStatus属性,您需要清除ModelState这些属性。

[HttpPost]
public async Task<ActionResult> Index(EmailService em)
{
  if (ModelState.IsValid)
  {
    ModelState.Clear(); // or `ModelState.Remove("Sent"); ModelState.Remove("Status")`
    em = await em.Send();
   }
  return View(em);
}