我现在已经和MVC合作了一段时间(2个月)并且我很喜欢它。我遇到过一些我无法在语言之间共享变量值的实例。例如。
在javascript / Jquery等中我可以设置cookie。但是服务器无法接受它们。
在C#/ Razor中,我可以设置查询字符串,ViewBags,ViewData,Sessions等。但是因为这是服务器端,客户端javascript无法得到它们。
我想知道的是,如果有一种相当简单的方法,我可以在C#或javascript中设置变量,如字符串,并在其他语言中以前或后回(无关紧要)读取它(即ac #Razor变量由Javascript读取,反之亦然。)
我还没有需要在AJax上使用Json或XML。但如果这有助于我会考虑它。我是新手,所以请原谅我的无知并感谢你的帮助。
答案 0 :(得分:6)
C# - > JS 强>
将变量放在隐藏的输入字段或data- *属性中,然后只使用Javascript或jQuery来检索这些值。
JS - > C#强>
使用ajax发回东西,或者你可以设置隐藏输入的值,然后只是对服务器执行正常的POST。
答案 1 :(得分:2)
如果隐藏的字段解决了你的问题,那么恕我直言,我会说这可能是最简单的方法。如果JS必须读取数据,并且您不希望它可见,那么隐藏的字段是有意义的。
但是,我需要有一些相当复杂的数据元素,比如来自数据库,需要以特定方式在JS中初始化 - 例如:事件日历。事件数据是从数据库中读取的,但必须以某种方式将其转换为JS数据分配。
我发现最直接的方法是@ Html.Raw(“无论你需要什么”)它们在视图的循环中,以便View输出Javascript - 听起来很笨,但我只用它来动态数据输出。可能有一种更简洁的方法(很高兴阅读建议),但它可以选择向JS传递更复杂的数据。
顺便提一下,数据会返回到服务器,因为URL是使用查询字符串来制作的(仅针对安全性问题较低的查找数据)。
答案 2 :(得分:2)
还有一个解决方案。您可以使用NewtonsoftJson将整个模型序列化,或仅将模型的某些部分或任何其他服务器变量序列化为json对象:
Javascript&剃刀:强>
var model = @Html.Raw(JsonConvert.SerializeObject(Model))
问题是使用这种方法可能会因为VS2012和Resharper的愚蠢而出现语法错误。但有一些技巧:Razor/JavaScript and trailing semicolon。
答案 3 :(得分:1)
如果它很复杂,你可能想要查看KnockoutJs.com - 它处理javascript的视图模型的序列化,并从你的盘子上做了很多工作。