这是控制器:
[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);
但是这个观点在发布之前仍处于同一状态?注意时间戳和它下面的字段?
调试数据包的时间,通过在帖子上的浏览器上按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控制器方法返回后返回!
答案 0 :(得分:3)
因为当您返回视图时,html帮助器会根据ModelState
中的值设置控件的值,而不是模型中的值。在this answer
为了呈现更新的Sent
和Status
属性,您需要清除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);
}