将 ViewBag 数据传递给 requirejs 或 knockout

Pass ViewBag data to requirejs or knockout

我是 js 的新手,现在正在尝试将 HTML5 AJAX File Uploader Module 集成到我的 ASP.NET MVC 项目中。

在我的项目中,有一个 ViewBag.UserID,在视图中我使用了模块中的脚本:

<script type="text/javascript" data-main="/scripts/main" src="/Scripts/require.js"></script>

我想我可以使用上面的脚本将 UserID 传递给 main.js,这样我就可以使用类似

的东西
var UserID;

html5Upload.initialize({
    // URL that handles uploaded files
    uploadUrl: '/file/upload?Userid=' + UserID,

    ...
    });

但是...我该怎么做才能实现它?

您可以使用一些引导代码将服务器端全局变量集成到您的 javascript 中。例如:

<script>
(function(myNamespace) {
  "use strict";

  myNamespace.UserInfo = {
    UserID: '@ViewBag.UserID' // injects viewbag info into javascript
  };

}(window.myNamespace = window.myNamespace || {}));
</script>

现在您拥有的 javascript 的任何位都可以访问全局 myNamespace 变量的 UserInfo 属性,其中包含 viewbag 数据。例如:

uploadUrl: '/file/upload?Userid=' + myNamespace.UserInfo.UserID,

@Jeroen 的建议很正确。然而,这里有另一种方法可能对你的目的来说有点矫枉过正,但你也可以在许多其他地方使用它: SuperScript 是一个库,它允许你声明,例如,服务器中的 JavaScript 变量-side 代码,并根据需要将该变量 emitted 到输出网页。

所以在你的情况下你可以有类似

的东西
SuperScript.JavaScript.Declarations.AddVariable(opt => opt.EmitterKey("javascript")
                                                          .Name("user_id")
                                                          .Value(UserID));

在你的 Razor 视图/_layout

@SuperScript.Declarations.EmitFor("javascript")

哪个会写出来

var user_id = "...";    // the string value of UserID

除了此解决方案背后的可扩展性之外,它还允许您避免在不存在 ViewBag 属性的共享视图中出现错误,并提供一种轻松地将 values/objects 从代码移动到前端的方法。

免责声明:我是 SuperScript 的开发者之一。