繁体   English   中英

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

[英]tempdata not working in javascript in mvc3?

当我开始使用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”]'显示为字符串...

可能是我的错误?

@...语法仅在Razor( .cshtml )文件中被解释为服务器端。 在JavaScript( .js )文件中, @并不特殊 - 在这种情况下,它只是字符串文字中的另一个字符。

至于:

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

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

它们实际上有用的是允许您进行DRY ,定义一次包含在多个视图中的常用函数,以及允许浏览器在视图更新时缓存脚本。

因此,如果这些是常见任务,请在.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>

如果您不想在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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM