2011-09-15 20 views
5

webapp私はモーダルウィンドウでASP MVC Ajaxフォームを使用しています。ASPを含むモーダルウィンドウ閉じるMVC Ajaxフォーム

@Ajax.ActionLink("Open", "Add", "Home", new {id = Model.Id}, new AjaxOptions { HttpMethod = "GET", UpdateTargetId = "modal", OnSuccess = "showModal()"}) 

は、このコードはdiv要素の中に私のフォーム(部分図)をロードし、モーダルウィンドウとしてそれを開く:私はいくつかだけが(すなわちshowModal()関数)モーダルウィンドウを開くには、任意の特定のjQueryのコードを使用していません。フォームのActionResultを送信する際には、デフォルトのModelStateオブジェクトを使用して検証し、エラーの場合はモデルエラーを含む部分ビューを返します。これは、次の状況を除いて正常に動作します。モデルにエラーがない場合は、モーダルウィンドウを自動クローズします。私は以下を試しました:

@using (Ajax.BeginForm("Save", "Home", new AjaxOptions {HttpMethod = "POST", UpdateTargetId = "modal", OnSuccess = "hideModal(); alert('Saved');"})) 

しかし、モデルにエラーがある場合、Ajax呼び出しはまだ有効なので、OnSuccessが呼び出されます。私は部分的なビューでHttpStatusCodeエラーを送信してこれを解決しようとしましたが、divは新しいhtmlで更新されません。 私は唯一の解決策は、モデルにエラーが含まれていない場合、モーダルウィンドウを閉じるjavascriptコードを含む部分的なビューを送信していると思うが、このソリューションは私の意見では非常にきれいではありません。他のアイデア?

答えて

9

今日は同じことをやっていました。私が思いついた解決策は、アクションが成功したときにプロパティをtrueに設定してJsonResultを返すことでした。 AjaxOptionsのOnSuccessコールバックでプロパティをチェックし、モーダルウィンドウを閉じました。

コントローラメソッド

[HttpPost] 
public ActionResult Hold(JobStatusNoteViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     //do work 
     return Json(new {success = true}); 
    } 

    return PartialView("JobStatusNote", model); 
} 

PartialView

<% using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "JobStatusForm", OnSuccess = "closePopUp" })) { %> 
<div id="JobStatusForm"> 
    <!-- Form --> 
</div> 
<% } %> 

<script> 
function closePopUp(data) { 
if (data.success) { 
    //close popup 
    } 
} 
</script> 
+0

おかげで病気それを試してみます!参考までに、JavaScriptコードをインラインで入れていることにお気づきになりましたか? UnobtrusiveがオンになっているときにChromeでOnSuccessが機能しないのですか?関数名を使用して修正することができます。 – Marthijn

+0

私はより多くのブラウザテストを行う必要がありますが、今は上記のコードはMVC3を使ってChrome 14、IE9、FF7で動作します。私はインラインのコードがコールバックのMVC2で壊れていたが、MVC3で修正されたというSOの質問を見ました。 –

+0

インラインコードの代わりに関数名を使用するようにコードを更新しました。私はモーダルを複数のページで使用しなければならず、それをドライ状態にしておきたい –

関連する問題