1

サイトで複数回使用されている部分ビューがあります。レコードを「保存」した後の場所に応じて、異なる処理を行う必要があります。

そこで、コールバック関数を文字列としてコントローラーに渡し、それを部分ビューに戻すことを考えていました。

これを行うより良い方法はありますか?

4

3 に答える 3

2

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 つの「保存」アクション メソッドを実装できます。どちらも標準の「保存」機能を実行できますが、それぞれの場合に必要な固有の動作も実行できます。

于 2012-10-29T23:24:17.503 に答える
2

必要に応じて、リフレクションを介してメソッドを呼び出すマジック ストリングを渡すことができます。

より良い方法はありますか?

この投稿の発信元を特定し、それに基づいてケースを処理することをお勧めします。

HttpContext.Current.Request.Url

スイッチをオンにするのに十分な情報が含まれています。

于 2012-10-29T23:25:49.750 に答える
1

古い質問ですが、これを行う方法を探していて、何かを思いつきました。

メイン ビューと子部分ビューに非常に単純なものを追加して、部分ビューの 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 をアラート ボックスに表示するだけの関数で上書きされます。

于 2015-02-24T23:45:43.923 に答える