これが JavaScript コールバック関数を部分ビューに渡す正しい方法かどうか疑問に思っています。そのため、部分ビューのビューによっては、異なることを行う場合があります。そこで、これを実現するために JavaScript コールバック関数を渡します。
ここに、部分ビューを呼び出す汎用関数と、JavaScript コールバック関数を渡す場所を示します。
function showAjaxMessage(targetDiv, ajaxMessage) {
var ajaxLoader = "<img src='Content/loader.gif' alt=''>";
$(targetDiv).html("<p>" + ajaxLoader + " " + ajaxMessage+"</p>");
}
function getPartialView(actionUrl, targetDiv, ajaxMessage, cbFunc) {
showAjaxMessage(targetDiv, ajaxMessage);
$.get(actionUrl, { callback: eval(cbFunc).toString()}, function(result) {
$(targetDiv).html(result);
});
}
これは私がそれを呼び出す例です:
getPartialView("Home/OpenLogin", "#divLogon", "Loading...", function() { alert('This is the call back function!'); test(); });
これは、コールバック関数を取得してモデルに保存するコントローラーです。次に、それを部分ビューに戻します。
// returns a login dialog which will be injected
// into a placeholder div on the client
public ActionResult OpenLogin(string callback)
{
var baseModel = new BaseModel();
baseModel.cbFunc = callback;
return PartialView("LoginDialog", baseModel);
}
これが私の部分的なビューの例です。ご覧のとおり、コールバック関数を取得し、init 関数に設定しています。
@model MvcApplication8.Models.BaseModel
function init(cb){
if(cb!=undefined){
cb();
}
else{
alert("undefined");
}
}
function test(){
alert("Testing my call back");
}
$(function () {
init(@Html.Raw(@Model.cbFunc));
});
上記の解決策は機能しますが、頭に浮かぶ主な質問は、これが正しい方法ですか? コントローラーから部分ビューにコールバック関数を渡すのは間違っているように聞こえますが、他にどのように行うのでしょうか? 何か案は?