【问题标题】:tempdata not working in javascript in mvc3?tempdata 在 mvc3 中的 javascript 中不起作用?
【发布时间】:2012-05-28 02:44:14
【问题描述】:

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

我的错误可能是什么?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        • 1970-01-01
        相关资源
        最近更新 更多