お問い合わせフォームの後にメッセージを投稿しようとしています。ユーザーが送信ボタンをクリックした後にメッセージが送信されたことを示しています。別のページにリダイレクトしたり、HTTP Post アクション メソッド内で別のビューを返したりしたくありません。ASP.NET MVC フレームワークでそのようなことを行うにはどうすればよいですか?
以下は私のコードサンプルです:
@*contactus.cshtml*@
@model MySite.Models.ContactModel
@using (Html.BeginForm())
{
<div class="col-md-6">
<div class="form-group">
@Html.TextBoxFor(model => model.Name})
<p>@Html.ValidationMessageFor(model => model.Name)</p>
</div>
<div class="form-group">
@Html.TextBoxFor(model => model.Email)
<p>@Html.ValidationMessageFor(model => model.Email)</p>
</div>
<div class="form-group">
@Html.TextAreaFor(model => model.Message)
<p>@Html.ValidationMessageFor(model => model.Message)</p>
</div>
<div class="col-lg-12">
<button type="submit">Send Message</button>
</div>
</div>
}
@*ContactModel.cs*@
public class ContactModel
{
[Required(ErrorMessage = "* Please enter your name.")]
[StringLength(100, MinimumLength=3, ErrorMessage="* Please enter your full name.")]
public string Name { get; set; }
[Required]
[EmailAddress(ErrorMessage="* Not a valid email address.")]
public string Email { get; set; }
[Required]
public string Message { get; set; }
}
現在、ホーム/インデックス ページに問い合わせフォームしかなく、他のページにリダイレクトしたくありません。ボタンのすぐ下にメッセージを表示したいのSend Message
ですが、以下のアクションメソッドを使用してそれを行う方法がわかりません。
@*HomeController.cs*@
public ActionResult Index(ContactModel model)
{
if (ModelState.IsValid)
{
// this is my helper library, for brevity, I'm not copying it.
EmailHelper emailService = new EmailHelper();
bool success = emailService.SendEmail(model.Name, model.Email, model.Message);
return Content(success ? "success" : "no...something went wrong :(");
} else {
return View(model);
}
}
現在、このコントローラーは内部の文字列を返し、Content
ページ全体を置き換えます。この文字列を連絡先フォームの下に返したいと思います。また、同じ html ページに 2 つ目のお問い合わせフォームを含む 2 つのセクションがあり、View(model) を返すと、最初のセクションに自動的にリダイレクトされますが、これは理想的ではありません...コントローラーにどのように指示しますか? POST メソッドの後の 2 番目のセクションにのみリダイレクトしますか? さらに、ページ全体を返さない方が効率的だと思います...メッセージ文字列のみをdivに返す方法はありますか?