【问题标题】:Pass username from ViewBag to knockout viewmodel将用户名从 ViewBag 传递到淘汰视图模型
【发布时间】:2012-09-05 20:12:56
【问题描述】:

试图在这里拼凑一些碎片。

第 1 部分:我知道我可以通过以下方式获取 MVC 中的当前用户名:

@HttpContext.Current.User.Identity.Name

在我看来。

第二部分:我在一个单独的 JS 文件中有一些 MVVM 风格的代码,相关部分如下所示:

var FeedbackViewModel = function () {
    var self = this;
    self.username = ko.observable("");
    self.feedbackText = ko.observable("");
    self.userNameCaptured = ko.computed(function () { return self.username().length > 3; }, self);
};

var feedbackViewModel = new FeedbackViewModel();
ko.applyBindings(feedbackViewModel, document.getElementById("feedbackModal"));

问题:如何将当前用户名从 MVC3 传递到 Knockout viewModel,以便我可以观察并据此采取行动?

【问题讨论】:

  • 我看到了混乱,顺便说一句:如果您想在 JS 文件本身中实例化 ViewModel,请将其设为全局(最好在命名空间中),以便您可以从 HTML 访问它。出于这个原因,我更喜欢在 HTML 中进行实例化。

标签: asp.net-mvc-3 razor knockout.js httpcontext


【解决方案1】:

我假设feedbackViewModel 被定义为一个全局变量,因此您可以简单地向 CSHTML 文件添加一些代码以内联填充它:

<script type="text/javascript">
feedbackViewmodel.username("@HttpContext.Current.User.Identity.Name");
</script>

另一种选择是将变量作为构造函数元素传递给 ViewModel 函数。

【讨论】:

  • 嗨 Joel -- 正如我所提到的,我的 JavaScript 在一个单独的 JS 文件中,因此我认为它的解释不同。但不完全确定;我必须检查一下,看看我是否也能让它以这种方式工作。感谢您的提示!
  • JavaScript 在单独的文件中并不重要,它仍然必须导入 HTML。这意味着您应该有权访问 ViewModel 对象,在这种情况下,其中任何一个都可以工作。
  • 乔尔,我认为这很聪明。通过将 Razor 变量注入到 feedbackViewmodel 中,您可以跳过添加的 jquery 选择器并在 dom 源中公开值。我看到的唯一缺点是必须从单个视图进行调用 feedbackViewmodel.username("HttpContext....") 。你说它可以移动到一个 js 文件中,但是一个 js 文件如何解释一个 Razor 变量呢?我错过了什么吗?
  • PS +1 这个答案。我打算用这种方式重构我的一些代码。
  • 戴夫:什么都没有被隐藏。假设是 View 可以 runtime 访问 JS 文件中定义的 ViewModel 实例。 Razor 只是用于在 HTML 文件中编写 JavaScript 代码,该文件在运行时被调用以设置 ViewModel 的可观察属性。这主要是因为 Intellisense 在使用 Razor 编写 JS 时会破坏块。 jQuery 也与它无关,因为 Knockout 将处理与 VM 属性的绑定。
【解决方案2】:

(我宁愿将此作为评论发布而不是回答,但不知何故这里没有选择)

我过去也遇到过类似的问题(razor 和 javascript 之间的切换)。我找到的最佳答案是创建一个隐藏控件(#hiddenval 或 #username),然后可以由 JQuery 选择器“读取”。

这种方法每次都适合我。它不优雅,可能会将信息暴露给获取 html 的用户...

如果不是很明显,@HttpContext.Current.User.Identity.Name 应该作为标记的一部分填充

【讨论】:

  • 嗨,戴夫,我认为这是一个很好的答案——这不是最理想的方法,但肯定是一种有效的方法。当我实现它时,我可能会用一些代码清理/更新这个答案。
  • Goober,您是否考虑过创建一个将其作为 json 对象返回的操作方法(get)?我所做的优势是数据不是 DOM 的一部分并且不易检测到。缺点再次是从浏览器对 .NET 的额外调用。
  • 响应乔尔的方法:它工作得很好,但取决于你的 jscript 驻留在你的视图而不是 js 文件(因为我怀疑你有组织)。不过,如果您从 razor 视图中填充变量或构造函数,您仍然可以使用这种方法。
  • 明确一点,这并不准确:您可以轻松地将 ViewModel 放在单独的 JS 文件中。可以这样想:HTML always 必须能够访问 JS 对象,所以您所做的就是访问 HTML 中的 JS 对象(在 JS 文件中定义)。最有可能的是,您在 HTML 中实例化 ViewModel,但即使 JS 文件创建了它,该对象仍然需要从 HTML 访问,所以您所做的就是在 JS 对象上设置一个属性。
  • @JoelCochran,是的,当您 8 个月前在您自己的回答中澄清我的陈述时,我明白了。我当时给你的评论和回答 +1。
猜你喜欢
  • 2017-12-10
  • 2016-03-11
  • 1970-01-01
  • 2018-10-29
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
相关资源
最近更新 更多