将ViewBag数据传递给requirejs或knockout

时间:2016-06-08 07:47:11

标签: javascript asp.net-mvc knockout.js requirejs viewbag

我是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,

    ...
    });

但是......我该怎样做才能实现这个目标?

2 个答案:

答案 0 :(得分:1)

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

<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,

答案 1 :(得分:1)

@Jeroen的建议是完全正确的。但是,这里的另一种方法可能对您的目的而言过于苛刻,但您也可以在许多其他地方使用它:SuperScript是一个允许您在服务器中声明例如JavaScript变量的库这些代码并将发出的变量发送到输出网页,无论你喜欢什么。

所以在你的情况下,你可以有像

这样的东西
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属性不存在的共享视图中的错误,并提供一种方法,可以轻松地将值/对象从代码移动到前端。

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