gpt4 book ai didi

asp.net-mvc - 为什么 MVC Post (ViewModel) 不会使用异步返回更新后的表单?

转载 作者:行者123 更新时间:2023-12-01 23:49:48 25 4
gpt4 key购买 nike

这是 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 在发布之前仍保持相同状态?注意到时间戳及其下方的字段了吗?

enter image description here

是时候调试数据包了,在发布时按浏览器上的 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 中解释了该行为的原因。

为了呈现更新后的 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);
}

关于asp.net-mvc - 为什么 MVC Post (ViewModel) 不会使用异步返回更新后的表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27117112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com