5

ac#コントローラーからjavascript変数を設定することは可能ですか? ユーザーのログインを必要としないダム ダウン バージョンでマスター ページをオーバーライドする状況があります。ただし、javascript タイムアウト タイマーは引き続き実行されます。マスターをオーバーライドするコントローラーメソッドで、タイムアウトを巨大なものにオーバーライドしたいと思います。

public dumbDownController()
{
     ViewData["MasterPageOverride"] = "~/Views/Shared/_NoLogin.cshtml";

     //Somehow reset that timer below from 20 to like 9999. To simulate no timeout.

     return View("Cities", model);
}

次に、javascript ファイルがあります。

tb.sessionTimer = (function () {
   var SESSION_TIMEOUT = 20;
   var currentTimeoutCounter = SESSION_TIMEOUT * 60;
 ...
 lots more irrelevant to question
 ...
 }

アプリが大きいので、javascript をほとんど変更しないようにしています。コントローラーから操作したい。

4

3 に答える 3

7

簡潔な答え:

<script>
    var xyz = @ViewData["MasterPageOverride"];
</script>

より長い答え:

Controller で JavaScript 変数を直接割り当てることはできませんが、View では同じことができる JavaScript を出力できます。

何らかの方法で変数をビューに渡す必要があります。この例では、ViewDataオブジェクト ディクショナリを使用します。コントローラーで要素を設定できます。

public ActionResult SomeAction()
{
    ViewData["aNumber"] = 24;
}

次に、ビューで次のように使用できます。

<script>
    var xyz = @ViewData["aNumber"];
</script>

これはクライアント ブラウザに次のように送信されます。

<script>
    var xyz = 24;
</script>

''またはで囲む必要があるため、文字列にはもう少し注意が必要です""

<script>
    var xyz = "@ViewData["aString"]";
</script>

@Graham がコメントで述べたように、文字列がたまたま有効なJSON (または任意のオブジェクト リテラルですが、 JSON を作成するのは非常に簡単です) であり、それを JavaScript オブジェクトとして使用したい場合は、次のことができます。

<script>
    var xyz = @ViewData["aJsonString"];
</script>

出力が有効な JavaScript であることを確認してください。

脚注として、XSS 攻撃を防ぐため<に自動的にHTML エンコードされるなど、特別な HTML 文字には注意してください。また、HTML ではなく JavaScript を出力しているため、問題が発生する可能性があります。これを防ぐには、次Html.Raw()のように使用できます。

<script>
    var xyz = @Html.Raw(ViewData["aJsonString"]);
</script>
于 2012-11-08T18:05:54.640 に答える
0

がコントローラーのスコープ内にある場合tbは、sessionTimer関数をオーバーライドすることを検討してください。

public dumbDownController(){
   ...
   tb.sessionTimer = function(){return false;}
}
于 2012-11-08T18:00:43.217 に答える
0

2つのオプションがあります(私が理解しているように):

次のように、viewbag、data、tempdata から変数を作成します。

var SESSION_TIMEOUT = @ViewData["MasterPageOverride"];
var SESSION_TIMEOUT = @ViewBag["MasterPageOverride"];
var SESSION_TIMEOUT = @TempData["MasterPageOverride"];

または、jQuery AJAX 経由で実行します。

$.ajax({
                url: '/YourController/YourAction',
                type: 'post',
                data: { id: id },
                dataType: 'json',
                success: function (result) {
                    // setVar

                }
            });
于 2012-11-08T18:08:48.690 に答える