Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.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
C# MVC ASP&;Javascript变量共享_C#_Javascript_Asp.net Mvc_Razor - Fatal编程技术网

C# MVC ASP&;Javascript变量共享

C# MVC ASP&;Javascript变量共享,c#,javascript,asp.net-mvc,razor,C#,Javascript,Asp.net Mvc,Razor,我已经在MVC工作了一段时间(2个月),我大部分时间都喜欢它。我遇到了一些无法在语言之间共享变量值的实例。比如说 在javascript/Jquery等中,我可以设置cookies。但是服务器无法找到它们 在C#/Razor中,我可以设置查询字符串、视图包、视图数据、会话等。但由于这是服务器端,客户端javascript无法访问它们 我想知道的是,如果有一种相当简单的方法,我可以在C#或javascript中设置一个类似字符串的变量,然后用另一种语言(即,javascript读取的C#Razor

我已经在MVC工作了一段时间(2个月),我大部分时间都喜欢它。我遇到了一些无法在语言之间共享变量值的实例。比如说

在javascript/Jquery等中,我可以设置cookies。但是服务器无法找到它们

在C#/Razor中,我可以设置查询字符串、视图包、视图数据、会话等。但由于这是服务器端,客户端javascript无法访问它们

我想知道的是,如果有一种相当简单的方法,我可以在C#或javascript中设置一个类似字符串的变量,然后用另一种语言(即,javascript读取的C#Razor变量,或相反)在前或后读取它(无所谓)

我还不需要在AJax中使用Json或XML。但如果这会有帮助的话,我会考虑的。我对这一切都不熟悉,请原谅我的无知,谢谢你的帮助。

C#->JS

将变量放入隐藏的输入字段或data-*属性中,然后只使用Javascript或jQuery检索这些值

JS->C#


要么使用ajax将内容发送回服务器,要么设置隐藏输入的值,然后只向服务器发送普通形式的POST。

如果隐藏字段解决了问题,那么我认为这可能是最简单的方法。如果JS必须读取数据,而您不希望数据可见,那么隐藏字段是有意义的

然而,我需要一些相当复杂的数据元素,比如说来自DB的数据元素,需要用JS以特定的方式进行初始化,例如:事件日历。事件数据是从数据库中读取的,但必须以某种方式将其转换为JS数据分配

我发现最直接的方法是@Html.Raw(“任意你需要的”)在视图中循环它们,这样视图就输出Javascript了——听起来很难听,但我只将其用于动态数据输出。也许有一种更干净的方法可以做到这一点(很乐意阅读建议),但它是向JS交付更复杂数据的一种选择


顺便说一句,数据会返回到服务器,因为URL是用QueryString精心编制的(仅适用于安全问题较低的查找数据).

如果它很复杂,您可能需要查看KnockoutJs.com-它可以处理viewmodel与javascript之间的序列化,并且可以节省大量工作。

还有一个解决方案。您可以使用NewtonsoftJson将整个模型、模型的一部分或任何其他服务器变量序列化为json对象:

Javascript和Razor:

var model = @Html.Raw(JsonConvert.SerializeObject(Model))

问题是,由于VS2012和Resharper的愚蠢,使用这种方法可能会出现语法错误。但有一些技巧:

为什么您说您将无法在服务器端获取cookie?这是可能的。因此,本质上,两者通用的唯一简单方法是使用隐藏的输入字段。有趣。我教过这被认为是不好的做法,这就是为什么我以前从来没有这样做过。感谢您的反馈。隐藏输入字段旨在提供用户无需交互的数据传输。请注意,用户可以修改您存储在页面上的任何数据,这可能就是您认为这种做法不好的原因。因此,您永远不能信任隐藏的输入数据,您需要将其视为用户自己键入的数据。感谢您在这方面的帮助。感谢您的回答。我现在有一年多的MVC经验并解决了这个问题。然而,我确实喜欢你关于使用KnockoutJs的建议。在过去的一年里,我已经走上了完全分离关注点的道路,我的视图不包含任何代码/css,而是全部与外部文件链接。因此,我不再是KnockoutJs的粉丝,因为我觉得它太膨胀了html/razor。然而,这可能只是因为我缺乏使用击倒的经验。现在它不适合我的风格。但正如前面提到的,谢谢你的回答,这是一个很好的回答。谢谢你的回答。我将不得不花一点时间在未来看它,因为我已经离开了。不过,感谢您花时间查看并发布答案。