サイトで複数回使用されている部分ビューがあります。レコードを「保存」した後の場所に応じて、異なる処理を行う必要があります。
そこで、コールバック関数を文字列としてコントローラーに渡し、それを部分ビューに戻すことを考えていました。
これを行うより良い方法はありますか?
サイトで複数回使用されている部分ビューがあります。レコードを「保存」した後の場所に応じて、異なる処理を行う必要があります。
そこで、コールバック関数を文字列としてコントローラーに渡し、それを部分ビューに戻すことを考えていました。
これを行うより良い方法はありますか?
MVC では、すべてのアドレス/リソース/URL は、デフォルトでレンダリングされるパスに対して相対的です。そのため、パーシャル内にフォームがある場合、レンダリングされた URL に応じて、2 つの異なるコントローラー アクション メソッドに送信できます。たとえば、「更新」アクション メソッドに送信されるフォームを宣言するには、次のようにします。
@using (Html.BeginForm("Save")) {
このパーシャルが /Users/Home の下にレンダリングされると、html 出力は次のようになります。
<form action="/Users/Save" method="POST">
これは、パーシャルが /Products/Home の下にレンダリングされるときに変更されます。
<form action="/Products/Save" method="POST">
その後、Users コントローラーと Products コントローラーの両方に 2 つの「保存」アクション メソッドを実装できます。どちらも標準の「保存」機能を実行できますが、それぞれの場合に必要な固有の動作も実行できます。
必要に応じて、リフレクションを介してメソッドを呼び出すマジック ストリングを渡すことができます。
より良い方法はありますか?
この投稿の発信元を特定し、それに基づいてケースを処理することをお勧めします。
HttpContext.Current.Request.Url
スイッチをオンにするのに十分な情報が含まれています。
古い質問ですが、これを行う方法を探していて、何かを思いつきました。
メイン ビューと子部分ビューに非常に単純なものを追加して、部分ビューの ajax ポストの後に javascript メソッドをメイン ビューで設定できるようにしたいと考えていました。
モデル データを渡す必要があるかどうかに応じて、次のいずれかの行を使用して、メイン ビューから部分ビューを呼び出します。
@{Html.RenderAction("_Create", new { Callback = "myCallback" });}
@{Html.RenderAction("_Create", new { Model = Model, Callback = "myCallback" });}
「myCallback」は JavaScript 関数の名前です。たとえば、次のようになります。
function myCallback(result) {
alert(result.Id);
}
ここからコントローラ アクションでこの値を要求し、アクションから値をビュー バッグに追加できますが、これを複数の部分ビューで使用する場合は、フィルタ属性でこれを行う方がクリーンです。あなた。
次のカスタム アクション フィルターを作成します。
public class MyFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var callBackValue = filterContext.RouteData.Values["Callback"];
if (callBackValue != null)
{
filterContext.Controller.ViewBag.Callback = callBackValue.ToString();
filterContext.RouteData.DataTokens.Remove("Callback");
filterContext.RouteData.Values.Remove("Callback");
}
base.OnActionExecuting(filterContext);
}
}
これにより、RouteData オブジェクトから「Callback」値が取得され、ViewBag.Callback 値に設定されます。RouteData から必ず値を削除してください。削除しないと、コントローラー アクションが見つかりません ("Callback" というパラメーターを持つアクションを探すため)。
次に、ビューから でこの値にアクセスできます@ViewBag.Callback
。たとえば、次の ajax 呼び出しがあるとします。
function createProduct(callback) {
$.ajax({
type: 'POST',
url: '/Product/_Create',
data: {
Name: $('#Name').val()
},
success: function (result) {
var callBack = @(ViewBag.Callback ?? "null");
if (callback)
callback(result);
else {
if (result) {
var url = '/Product/Details';
url += "/" + result.Id;
window.location.href = url;
}
}
},
error: function (ajaxContext) { alert('Bad error'); },
timeout: 10000
});
}
部分ビューのデフォルトの動作は、詳細ページをロードすることですが、別のコールバック関数がメイン ビューによって提供される場合 (または ViewBag.Callback に入る場合)、コールバック関数は上書きされます。ここで、私のメイン ビューは、新製品の ID をアラート ボックスに表示するだけの関数で上書きされます。