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

时间:2012-05-28 02:44:15

标签: javascript asp.net-mvc-3 tempdata

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

可能是我的错误?

2 个答案:

答案 0 :(得分:2)

@...语法仅在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>

答案 1 :(得分: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。