リンク(Ajax.ActionLink)のあるMVC3のページがあります。ユーザーがクリックすると、コントローラーのアクションが呼び出され、結果が置換されて div に挿入されます。
コードを以下に示します。
@Ajax.ImageActionLink("/Images/btn_share.png", "Share pool", "SharePool", new { poolKey = Model.Id, poolName = Model.Name },
new AjaxOptions {
UpdateTargetId="popup",
HttpMethod="GET",
InsertionMode = InsertionMode.Replace,
LoadingElementId="loading_dialog",
OnSuccess = "ShowPopup('#popup_share', true, true)"
}
ImageLinkAction は、画像をリンクとして使用するためのカスタム拡張メソッドです。ShowPopup は、更新された div を表示する JavaScript 関数です (ポップアップのように見せるため)。
ポップアップを作成する div に挿入されたマークアップ コードには、以下のようなフォームが含まれています。
<div>
@using (Html.BeginForm()) {
@Html.HiddenFor(model => model.ID)
<div class="editor-label">
@Html.LabelFor(model => model.EmailAddress)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.EmailAddress)
@Html.ValidationMessageFor(model => model.EmailAddress)
</div>
// ... other fields
@Html.ValidationSummary(true)
<p>
<button type ="submit">Share</button>
</p>
}
</div>
問題はフォームの送信にあります。[送信] ボタンは適切なアクションを呼び出しますが、ポストバックが発生するため、ページが更新されます。必要なのは、ajax を使用してデータを投稿し、応答を受信することです。これは、に挿入される別の部分ビューです。
以下のように、送信ボタンを Ajax.ActionLink に置き換えようとしていました
@Ajax.ActionLink("Share", "Share",
new Models.MyModel
{
ID = Model.ID,
EmailAddress = Model.EmailAddress
},
new AjaxOptions
{
UpdateTargetId="popup",
HttpMethod="POST",
InsertionMode = InsertionMode.Replace,
LoadingElementId="loading_dialog",
OnSuccess = "ShowPopup('#popup_share', true, true)"
}
コントローラーのコードは次のようになります。
[HttpPost]
public ActionResult SharePool(MyModel model)
{
// ...
return PartialView("_MyPartialView", model)
}
問題は、Ajax ActionLink がレンダリングされる瞬間 (フォームが読み込まれるとき) に Model.EmailAddress に値がないため、コントローラーの POST アクションが ID パラメーターのみを受け取ることです。
どうすればこれを処理できますか? 理想的には、追加する必要があると思います
OnBegin = "PreparePostData()"
しかし、基本的にJavaScriptしか知らないので、これをどのように実装できるかわかりません。この PreparePostData() は、フォーム フィールドを収集し、オブジェクトの routeValues パラメータを準備して、ajax 呼び出しが呼び出される前に設定する必要があると思います。
これを実装する方法について、誰かが私にいくつかの指示を与えることができますか?
または、この問題に対する他のより良いアプローチはありますか?
ありがとうございました