在mvc3中,tempdata不能在javascript中工作?
当我开始使用asp mvc3时,我正在将脚本放在我的视图文件(cshtml)中。我是这样做的:在每个cshtml文件的底部,我放上我的脚本。。。。有些脚本使用TempData,一切正常 但后来有人告诉我,让用户看到我如何编写脚本是一个坏习惯。他们说我应该创建一个js文件并将我所有的脚本放在那里,我应该这样调用它们:在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">
<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