Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 将用户名从ViewBag传递到淘汰viewmodel_Asp.net Mvc 3_Razor_Knockout.js_Httpcontext - Fatal编程技术网

Asp.net mvc 3 将用户名从ViewBag传递到淘汰viewmodel

Asp.net mvc 3 将用户名从ViewBag传递到淘汰viewmodel,asp.net-mvc-3,razor,knockout.js,httpcontext,Asp.net Mvc 3,Razor,Knockout.js,Httpcontext,试着把一些碎片拼在一起 第1部分:我知道我可以通过以下方式获得MVC中的当前用户名: @HttpContext.Current.User.Identity.Name 在我看来 第2部分:我在一个单独的JS文件中有一些MVVM风格的代码,相关部分如下所示: var FeedbackViewModel = function () { var self = this; self.username = ko.observable(""); self.feedbackText =

试着把一些碎片拼在一起

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

@HttpContext.Current.User.Identity.Name
在我看来

第2部分:我在一个单独的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传递到淘汰视图模型,以便我可以观察并根据它采取行动?

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

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

这种方法每次对我都有效。这是不雅观的,可能会将信息暴露给寻找html的用户

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

(我宁愿将其作为注释而不是答案发布,但不知何故,这里没有选项)

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

这种方法每次对我都有效。这是不雅观的,可能会将信息暴露给寻找html的用户


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

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

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

feedbackViewmodel.username(“@HttpContext.Current.User.Identity.Name”);

另一个选项是将变量作为构造函数元素传递到ViewModel函数中。

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

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

feedbackViewmodel.username(“@HttpContext.Current.User.Identity.Name”);


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

嗨,Dave,我认为这是一个很好的答案——不是最理想的方法,但肯定是一种有效的方法。当我实现这个答案时,我可能会用一些代码来清理/更新它。Goober,你考虑过创建一个作为json对象返回它的操作方法(get)吗?我所做的优点是数据不是DOM的一部分,而且不易检测。另一个缺点是从浏览器中额外调用.NET。作为对Joel方法的响应:它工作得很好,但取决于驻留在视图中的jscript,而不是js文件(我怀疑您已经组织好了)。尽管如此,如果从razor视图中填充变量或构造函数,您仍然可以使用这种方法。可以这样想:HTML总是必须访问JS对象,所以您所做的就是访问HTML中的JS对象(在JS文件中定义)。很可能,您正在HTML中实例化ViewModel,但即使JS文件创建了它,该对象仍然需要从HTML中访问,因此您所做的只是在JS对象上设置一个属性。@JoelCochran,是的,当您在8个月前的回答中澄清我的陈述时,我明白了。我当时给你的评论和回答打了+1。嗨,戴夫,我认为这是一个很好的答案——不是最理想的方法,但肯定是一个有效的方法。当我实现这个答案时,我可能会用一些代码来清理/更新它。Goober,你考虑过创建一个作为json对象返回它的操作方法(get)吗?我所做的优点是数据不是DOM的一部分,而且不易检测。另一个缺点是从浏览器中额外调用.NET。作为对Joel方法的响应:它工作得很好,但取决于驻留在视图中的jscript,而不是js文件(我怀疑您已经组织好了)。尽管如此,如果从razor视图中填充变量或构造函数,您仍然可以使用这种方法。可以这样想:HTML总是必须访问JS对象,所以您所做的就是访问HTML中的JS对象(在JS文件中定义)。很可能,您正在HTML中实例化ViewModel,但即使JS文件创建了它,该对象仍然需要从HTML中访问,因此您所做的只是在JS对象上设置一个属性。@JoelCochran,是的,当您在8个月前的回答中澄清我的陈述时,我明白了。我当时给你的评论和回答加了+1。嗨,Joel——正如我提到的,我的JavaScript在一个单独的JS文件中,因此我认为它的解释不同。但不完全确定;我得检查一下,看看能不能让它也这样工作。谢谢你的提示!JavaScript是否在单独的文件中并不重要,它仍然必须导入HTML。这意味着您应该可以访问ViewModel对象,在这种情况下,这两种方法都可以使用。Joel,我认为这很聪明。通过将Razor变量注入feedbackViewmodel,可以跳过添加的jquery选择器,并在dom源代码中公开该值。我看到的唯一缺点是call feedbackViewmodel.username(“HttpContext…”)必须从单个视图生成。您说它可以移动到js文件,但是js文件如何解释Razor变量呢?我遗漏了什么吗?这个答案是PS+1。我打算用这种方式重构我的一些代码。戴夫:没有什么是隐藏的。假设视图对JS文件中定义的ViewModel实例具有运行时访问权限。Razor只是用来在HTML文件中编写JavaScript代码,它