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,一次定义通用函数以包含在多个视图中,并允许浏览器在视图更新时缓存脚本。

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