0

asp mvc3を使い始めたとき、スクリプトをビューファイル(cshtml)に入れていました。私は次のようにそれを行っていました:各cshtmlファイルの下部にスクリプトを配置しました....そしてそれらのスクリプトのいくつかはTempDataを使用し、すべてが正常に機能します。

しかし、誰かが私に、スクリプトのコーディング方法をユーザーに見せることは悪い習慣だと言いました。彼らは、私がjsファイルを作成し、そこにすべてのスクリプトを配置する必要があり、次のように呼び出す必要があると言いました。

 <script src="@Url.Content("~/Scripts/myOwnLocalScripts.js")" type="text/javascript"></script>.

だから私はそれをしましたが、私のスクリプトは今やTempDataやセッションCookieさえも読み取ることができないようです。スクリプトに次のような行があります。

 var currentEmployee = '@System.Web.HttpContext.Current.Session["UserNumber"]';
 $('.textBoxEmployeeNumber input[id="EmployeeId"]').val(currentEmployee);

ユーザー番号を表示することになっていますが、「System.Web.HttpContext.Current.Session["UserNumber"]」を文字列として表示しています...。

さらに、スクリプトには次のようなコードがあります。

  if ('@TempData["successMessage"]' != "" || '@TempData["successMessage"]' != null) {
    function newAlert(type, message) {
        $("#alert-area").append($("<div class='alert alert-success " + type + " fade in' data-alert><p><b> " + message + " </b></p></div>"));
        $(".alert-success").delay(4000).fadeOut("slow", function () { $(this).remove(); });
    }
    newAlert('success', '@TempData["successMessage"]');
}

Tempdata [successMessage]に値が含まれている場合にのみ表示されるはずですが、ページが読み込まれるたびに表示され続け、「@TempData["successMessage"]」が文字列として表示されます...

私のエラーは何でしょうか?

4

2 に答える 2

2

@...構文は、Razor()ファイル内のサーバー側でのみ解釈されます.cshtml。JavaScript(.js)ファイルでは、@これは特別なことではありません。この場合、文字列リテラルの別の文字にすぎません。

はどうかと言うと:

それから誰かが私にそれは私が私のスクリプトをどのようにコーディングするかをユーザーに見せることは悪い習慣だと言いました

これは、個別のファイルの実際の理由ではありません.js。ブラウザがJavaScriptを読み取ることができれば、ユーザーもそれを読み取ることができます。

それらが実際に役立つのは、DRYになること、複数のビューに含めるための共通関数を1回定義すること、およびビューの更新中にブラウザーがスクリプトをキャッシュできるようにすることです。

したがって、これらが一般的なタスクである場合は、 :.jsから呼び出すことができる関数をで定義します。.cshtml

.js

function setCurrentEmployee(currentEmployee) {
    $('#EmployeeId').val(currentEmployee);
}

function newAlert(type, message) {
    if (message != "" || message != null) {
        $("#alert-area").append($("<div class='alert alert-success " + type + " fade in' data-alert><p><b> " + message + " </b></p></div>"));
        $(".alert-success").delay(4000).fadeOut("slow", function () { $(this).remove(); });
    }
}

.cshtml

<script>
    setCurrentEmployee('@System.Web.HttpContext.Current.Session["UserNumber"]');
    newAlert('success', '@TempData["successMessage"]');
</script>
于 2012-05-28T03:31:21.947 に答える
0

cshtmlでインラインjavascriptを使用したくない場合は、JavaScriptModel(http://jsm.codeplex.com)を使用してください。

コントローラアクションで次のコードを記述する必要があります。

this.AddJavaScriptVariable("CurrentEmployee", System.Web.HttpContext.Current.Session["UserNumber"]);
this.AddJavaScriptVariable("SuccessMessage", successMessage);
this.AddJavaScriptFunction("ReadyFunction");

.js:

var CurrentEmployee;
var SuccessMessage;
function ReadyFunction()
{
    setCurrentEmployee(CurrentEmployee);
    newAlert("success" SuccessMessage);
}

または、コントローラーアクションに次のコードを記述することもできます。

this.AddJavaScriptFunction("setCurrentEmployee", System.Web.HttpContext.Current.Session["UserNumber"]);
this.AddJavaScriptFunction("newAlert", "success", successMessage);

ただし、JavaScriptの他の場所でcurrentEmployeeを再利用できるため、最初のソリューションをお勧めします。

于 2013-01-09T12:36:44.803 に答える