Почему сообщение 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 ответ:
Потому что, когда вы возвращаете представление, помощники 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); }