2016-08-03 13 views
0

ユーザー入力に基づいてサイト所有者に電子メールを送信するサイトの連絡先ページのPOSTエンドポイントで、同じビューのViewResultを返信していますが、 )ビューモデル。MVCポストが適切なViewResultを返さない

私の目標は、POST応答を受け取ったときに、ユーザーに同じページを提供しますが、すべてのフォームフィールドを空白にします。しかし、これが行われるのではなく、同じフォーム情報がすべて記入された状態で、同じページでユーザーが終了します。電子メールは正常に送信され、エラーはスローされません。

アイデア?これが関連している場合は

[HttpGet] 
public ViewResult contact() 
{ 
    return View(new ContactUsViewModel()); 
} 

[HttpPost] 
public async Task<ViewResult> contact(ContactUsViewModel inputModel) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      string body = 
       "<div style='font-family: Arial, Helvetica, sans-serif; font-size: 13px; color: #444444;'>" + 
       "<p style='font-size: 17px;'>Email from <strong>{0}</strong> ({1})</p>" + 
       "<p>Date: {2}</p>" + 
       "<p>Phone: {3}</p>" + 
       "<p>Message:</p><p style='margin-left: 24px;'>{4}</p>" + 
       "</div>"; 
      string to = ConfigurationManager.AppSettings["ContactUsEmailAddress"]; 
      MailMessage message = new MailMessage(); 
      message.To.Add(new MailAddress(to)); 
      message.Subject = "Message from " + inputModel.Name; 
      message.Body = String.Format(body, new string[] 
       { 
        inputModel.Name, inputModel.Email, DateTime.Now.ToLongDateString(), inputModel.Phone, inputModel.UserMessage 
       } 
      ); 
      message.IsBodyHtml = true; 

      using (var smtp = new SmtpClient()) 
      { 
       await smtp.SendMailAsync(message); 
       // the "true" parameter in the constructor just sets a "Message sent" 
       // confirmation message in the view model that is displayed on the view 
       // via Razor. 
       return View(new ContactUsViewModel(true)); 
      } 
     } 
     else 
     { 
      return View(inputModel); 
     } 
    } 
    catch (Exception ex) 
    { 
     string ourEmailAddress = ConfigurationManager.AppSettings["ContactUsEmailAddress"]; 
     inputModel.PublicErrorMessage = "There was a problem sending your message. Please send an email directly to " + 
      "<a href='mailto:" + ourEmailAddress + "'>" + ourEmailAddress + "</a> so we can hear from you :)"; 
     inputModel.InternalErrorMessage = ex.Message; 
     return View(inputModel); 
    } 
} 

が、ここにも私のContactUsViewModel次のとおりです:ここで

は私のGETとPOSTエンドポイントです

public class ContactUsViewModel : BaseViewModel 
{ 
    public ContactUsViewModel() { } 
    public ContactUsViewModel(bool messageSent) 
    { 
     this.MessageSentConfirmation = "Your message has been sent. We will get back to you shortly!"; 
    } 

    [Required(ErrorMessage = "Please include your name.")] 
    public string Name { get; set; } 

    [Required(ErrorMessage = "Please enter a valid email address.")] 
    [EmailAddress(ErrorMessage = "Please enter a valid email address.")] 
    public string Email { get; set; } 

    [Phone(ErrorMessage = "Please enter a valid phone number.")] 
    public string Phone { get; set; } 

    [Required(ErrorMessage = "Please enter a message.")] 
    public string UserMessage { get; set; } 

    public string MessageSentConfirmation { get; private set; } 
} 

EDIT:私は知っているPost-Redirect-Get design patternだろう技術的にこの問題を回避しますが、空のビューモデルで同じビューを返すことができないという技術的な制限は実際には解決されません。そのため、私はPRGの実装を検討していません。

+0

これを行う正しい方法は、PRGパターンです。しかし、同じ値が表示されるのは、URLが変更されておらず、ブラウザがデータを独自にキャッシュする可能性が高いからです。 –

+3

PRGパターンに従う必要があります。これは、あなたが提出したものではなく**新しい**ビューを返すためですが、いつも 'ModelState.Clear()'を使うことができます。 [この回答](返信)http://stackoverflow.com/questions/26654862/textboxfor-displaying-initial-value-not-the-value-updated-from-code/26664111#26664111) –

+0

@StephenMuecke応答ありがとう。なぜなら、私のリターンステートメントでは、新しいモデルを初期化している( 'return View(new ContactUsViewModel())。もしModelState.Clear() (真)) ')? また、「メッセージを受信しました」というメッセージにアクセスできる専用のURLを使用しないようにしています。だから私は "メッセージ受信"と呼ばれる新しいビューを作ったので、私のリターンは次のようになります: '返されたビュー("メッセージ受信 ")'これは良いアイデアですか?実際のリダイレクト応答ではありませんが、 –

答えて

1

これはコメント欄の@StephenMueckeの解決策です。 returnステートメントが問題を解決する前に、コントローラのメソッドでModelState.Clear()を実行しています。

関連する問題