【问题标题】:Why would an MVC Post (ViewModel) not return updated form using Async?为什么 MVC Post (ViewModel) 不会使用异步返回更新的表单?
【发布时间】:2014-11-25 01:04:00
【问题描述】:

这是控制器:

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

但是视图在发布之前保持相同的状态?注意到时间戳及其下方的字段了吗?

是时候调试数据包了,在 post 上按浏览器上的 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 在异步控制器方法返回后提取了错误的副本以返回!

【问题讨论】:

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


    【解决方案1】:

    因为当您返回视图时,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);
    }
    

    【讨论】:

    • 谢谢斯蒂芬,我今天就试试这个。
    • 附注我只是喜欢这方面的 MSFT 文档:msdn.microsoft.com/en-us/library/…
    • 实验室结果显示,这成功了!再次感谢斯蒂芬。
    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2020-01-11
    • 2011-09-25
    相关资源
    最近更新 更多