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

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

这是 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/

相关文章:

asp.net-mvc - ASP.NET MVC 下拉列表

javascript - 如何将 xml 传递给 C# 中的 View ?

security - ASP.NET MVC 4 WebAPI - 可以将 session 状态用于安全资源吗?

c# - 使用 Linq 进行通配符搜索

c# - `EnumerableExecutor` 类的目的和用途是什么?

asp.net-mvc - 如何从 Views 文件夹中获取 Asp.net MVC 添加 View 对话框?

asp.net-mvc - 添加到我的命名空间的类在 MVC View 中不可用

c# - CSHTML 在元素 ID 中使用 C# 变量

wpf - 如何解决 Blend 4 中嵌入式用户控件中的设计时静态资源

c# - NHibernate:如何在没有延迟加载的情况下通过一个 sql 查询急切地获取带有子实体过滤器的子实体?