22

私は部分的なビューで次のjqueryを書きました:

    $.ajax({
        type: "POST",
        url: '@Url.Action("PostActionName", "ControllerName")',
        data: { Id: "01" },
        success: function(data)
            {
            if (data.success="true")
                {
                    window.location = '@Url.Action("GetActionName", "ControllerName")'
                }
            }
    });

アクション名とコントローラー名は固定ではなく、この部分ビューが配置されているビューに応じて変更されます。呼び出しアクションとコントローラー名を取得する関数がありますが、@Url.Action でそれらを渡す方法がわかりません。

以下は、アクションとコントローラーの名前を取得するための Javascript 関数です。

function ControllerName() {
            var pathComponents = window.location.pathname.split('/');
            var controllerName;
            if (pathComponents.length >= 2) {
                if (pathComponents[0] != '') {
                    controllerName = pathComponents[0];
                }
                else {
                    controllerName = pathComponents[1];
                }
            }
            return controllerName;
        }

        function ActionName() {
            var pathComponents = window.location.pathname.split('/');
            var actionName;
            if (pathComponents.length >= 2) {
                if (pathComponents[0] != '') {
                    actionName = pathComponents[1];
                }
                else {
                    actionName = pathComponents[2];
                }
            }
            return actionName;            
        }
4

3 に答える 3

33

呼び出しアクションとコントローラー名を取得する関数がありますが、@Url.Action でそれらを渡す方法がわかりません

これらの関数を呼び出すことができます。たとえば、UrlHelper クラスの拡張メソッドの場合:

window.location = '@Url.Action(Url.MyFunction1(), Url.MyFunction2())'

または、それらが単なる静的関数の場合:

window.location = '@Url.Action(SomeClass.MyFunction1(), SomeClass.MyFunction2())'

一方、渡す必要がある値がクライアントでのみわかっている場合は、次のことができます。

var param = 'some dynamic value known on the client';
var url = '@Url.Action("SomeAction", "SomeController", new { someParam = "__param__" })';
window.location.href = url.replace('__param__', encodeURIComponent(param));

アップデート:

そのように達成できる現在のコントローラーとアクションをフェッチしようとしているようです:

@{
    string currentAction = Html.ViewContext.RouteData.GetRequiredString("action");
    string currentController = Html.ViewContext.RouteData.GetRequiredString("controller");
}

その後:

window.location.href = '@Url.Action(currentAction, currentController)';
于 2013-04-17T06:08:13.997 に答える
4

このようなことを試しましたか?私は自分で試したことはありませんが、うまくいくはずです。

var dataToSend = "01";
var url = '/controllerName/actionName/' + dataToSend;
var actionName = ActionName();
var controllerName = ControllerName();
url.replace("actionName",actionName);
url.replace("controllerName",controllerName);
window.location = url;
于 2013-04-17T06:19:29.990 に答える