Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mvc3中,tempdata不能在javascript中工作?_Javascript_Asp.net Mvc 3_Tempdata - Fatal编程技术网

在mvc3中,tempdata不能在javascript中工作?

在mvc3中,tempdata不能在javascript中工作?,javascript,asp.net-mvc-3,tempdata,Javascript,Asp.net Mvc 3,Tempdata,当我开始使用asp mvc3时,我正在将脚本放在我的视图文件(cshtml)中。我是这样做的:在每个cshtml文件的底部,我放上我的脚本。。。。有些脚本使用TempData,一切正常 但后来有人告诉我,让用户看到我如何编写脚本是一个坏习惯。他们说我应该创建一个js文件并将我所有的脚本放在那里,我应该这样调用它们: <script src="@Url.Content("~/Scripts/myOwnLocalScripts.js")" type="text/javascript">

当我开始使用asp mvc3时,我正在将脚本放在我的视图文件(cshtml)中。我是这样做的:在每个cshtml文件的底部,我放上我的脚本。。。。有些脚本使用TempData,一切正常

但后来有人告诉我,让用户看到我如何编写脚本是一个坏习惯。他们说我应该创建一个js文件并将我所有的脚本放在那里,我应该这样调用它们:

 <script src="@Url.Content("~/Scripts/myOwnLocalScripts.js")" type="text/javascript"></script>.
它应该显示一个用户编号,但它将“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"]');
}
if(“@TempData[“successMessage”]”!=“| |”@TempData[“successMessage”]”!=null){
函数newAlert(类型、消息){
$(“#警报区”)。追加($(“”+消息+“

”); $(“.alert success”).delay(4000.fadeOut(“slow”,function(){$(this.remove();}); } newAlert('success',@TempData[“successMessage”]); }
它应该仅在Tempdata[successMessage]包含值时显示,但每次加载页面时它都会保持显示,并将“@Tempdata[“successMessage”]”显示为字符串


我的错误可能是什么?

@…
语法仅在Razor(
.cshtml
)文件中的服务器端进行解释。在JavaScript(
.js
)文件中,
@
并不特殊——在本例中,它只是字符串文本中的另一个字符

至于:

然后有人告诉我,让用户看到我如何编写脚本是一个坏习惯

这不是单独使用
.js
文件的实际原因——如果浏览器可以读取JavaScript,用户也可以读取它

它们真正有用的是允许您这样做,一次定义通用函数以包含在多个视图中,并允许浏览器在视图更新时缓存脚本

因此,如果这些是常见任务,请在
.js
中为它们定义可以从
.cshtml
调用的函数:

<script>
    setCurrentEmployee('@System.Web.HttpContext.Current.Session["UserNumber"]');
    newAlert('success', '@TempData["successMessage"]');
</script>
.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中使用内联javascript,请使用JavaScriptModel()

您只需在控制器操作中编写以下代码:

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

或者,您也可以在控制器操作中编写以下代码:

this.AddJavaScriptVariable("CurrentEmployee", System.Web.HttpContext.Current.Session["UserNumber"]);
this.AddJavaScriptVariable("SuccessMessage", successMessage);
this.AddJavaScriptFunction("ReadyFunction");
this.AddJavaScriptFunction("setCurrentEmployee", System.Web.HttpContext.Current.Session["UserNumber"]);
this.AddJavaScriptFunction("newAlert", "success", successMessage);
但是我建议您使用第一种解决方案,因为您可以在javascript的其他地方重用currentEmployee