0

この件に関する投稿がすでにいくつかあることは知っていますが、特定の問題に対する答えが見つからないようです。コントローラーに変数を渡すことができないのに、ハードコードされた値を渡すことができる理由について混乱しています...

これは機能します...

<script type="text/javascript">
$().ready(function () {
$("#MessageTypes").change(function () {
        //I know this is a horrible way to do it but for some reason I couldnt pass the sMessageType directly in
        var sMessageType = $("#MessageTypes").val();
        if (sMessageType == "Professional Voicefile") {
            $.get('@Url.Action("GenerateMessageDesc", new { MessageType = "Professional Voicefile" } )', function (data) {
                $('#MessageDesc').replaceWith(data);
            });
        }
        else if (sMessageType == "Dynamic Field") {
            $.get('@Url.Action("GenerateMessageDesc", new { MessageType = "Dynamic Field" } )', function (data) {
                $('#MessageDesc').replaceWith(data);
            });
        }
        else {
            //default to prof
            $.get('@Url.Action("GenerateMessageDesc", new { MessageType = "Professional Voicefile" } )', function (data) {
                $('#MessageDesc').replaceWith(data);
            });
        }
    });
}); 

...しかし、そうではありません。なんで?

<script type="text/javascript">
$().ready(function () {
    $("#MessageTypes").change(function () {
        var sMessageType = $("#MessageTypes").val();
            $.get('@Url.Action("GenerateMessageDesc", new { MessageType = sMessageType } )', function (data) {
                $('#MessageDesc').replaceWith(data);
            });
        }
    });
}); 

「名前 'sMessageType' は現在のコンテキストに存在しません」と表示されます。

コントローラーを呼び出してビューを更新する代わりに、ある種の ajax 呼び出しを使用する必要があると思いますが、シナリオ 1 は機能するのにシナリオ 2 は機能しないのはなぜですか?

4

1 に答える 1

1

「名前 'sMessageType' は現在のコンテキストに存在しません」と表示されます。

sMessageTypeサーバー側ヘルパー内で使用しようとしているクライアントに存在する JavaScript 変数です。JavaScriptがクライアントで実行され、サーバー側のスクリプトがサーバーで実行されるため、これは明らかに不可能です。

これを達成する正しい方法は次のとおりです。

$.get('@Url.Action("GenerateMessageDesc")', { messageType: sMessageType }, function (data) {
    $('#MessageDesc').replaceWith(data);
});

これにより、MessageType がクエリ文字列パラメーターとして渡されるため、ターゲット コントローラー アクションは次のようになります。

public ActionResult GenerateMessageDesc(string messageType)
{
    ...
}
于 2012-08-23T17:51:09.930 に答える