Почему сообщение MVC (ViewModel) не возвращает обновленную форму с помощью Async?


Вот контроллер:

    [HttpPost]
    public async Task<ActionResult> Index(EmailService em)
    {

        if (ModelState.IsValid)
        {
            await em.Send();

        }
        return View(em);
    }

Вот ViewModel Send; где "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 в браузере на post с точкой останова, установленной на входе в контроллер, чтобы он не отвечал... Это входящие данные:

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" на выходе установки break on controller ' s return View (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

Наблюдая за ответом 200 от браузера F12 Network side показал эту "старую" форму данных!

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!

1 3

1 ответ:

Потому что, когда вы возвращаете представление, помощники html устанавливают значение элементов управления из значений в ModelState, а не значение в модели. Причина такого поведения объясняется в этом ответе

Чтобы отобразить обновленные свойства 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);
}