这是 Controller :
[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;
}
}
我在 Controller 的此处设置了一个断点,并看到状态已正确更新,这意味着数据“正在以其应有的方式到达 View ”:“em”中确实有数据!关于这个声明。
return View(em);
但是 View 在发布之前仍保持相同状态?注意到时间戳及其下方的字段了吗?
是时候调试数据包了,在发布时按浏览器上的 F12,在进入 Controller 时设置一个断点,这样它就不会响应...这是入站数据:
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
这是 Controller 返回 View(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 在异步 Controller 方法返回后拉取了错误的副本以返回!
最佳答案
因为当您返回 View 时,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);
}
关于asp.net-mvc - 为什么 MVC Post (ViewModel) 不会使用异步返回更新后的表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27117112/