3

我已经与 MVC 合作了一段时间(2 个月),并且大部分时间都喜欢它。我遇到过一些无法在语言之间共享变量值的情况。例如。

在 javascript/Jquery 等中我可以设置 cookie。但是服务器无法访问它们。

在 C#/Razor 中,我可以设置查询字符串、ViewBags、ViewData、Sessions 等。但因为这是服务器端,客户端 javascript 无法获取它们。

我想知道的是,如果有一种相当简单的方法,我可以在 C# 或 javascript 中设置一个像字符串这样的变量,并在其他语言(即 ac# Razor 变量由 Javascript 读取,反之亦然)。

我还不需要在 AJax 中使用 Json 或 XML。但如果这有帮助,我会考虑的。我对这一切都很陌生,所以请原谅我的无知,并感谢您的帮助。

4

4 回答 4

6

C# -> JS

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

JS -> C#

要么使用 ajax 发回东西,要么你可以设置隐藏输入的值,然后只做一个正常的表单 POST 到服务器。

于 2012-07-03T18:18:23.337 回答
2

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

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

我发现最直接的方法是 @Html.Raw("whatever you need") 在视图中循环使用它们,以便视图输出 Javascript - 听起来很笨拙,但我只将它用于动态数据输出。可能有一种更简洁的方法来做到这一点(很高兴阅读建议),但它是向 JS 传递更复杂数据的一种选择。

顺便说一句,数据会返回到服务器,因为 URL 是用查询字符串制作的(仅用于在安全问题较低的情况下查找数据)。

于 2012-07-03T18:39:41.340 回答
2

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

Javascript 和剃刀:

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

问题是使用这种方法你可能会因为 VS2012 和 Resharper 的愚蠢而出现语法错误。但是有一些技巧:Razor/JavaScript 和尾随分号

于 2013-09-05T15:07:57.947 回答
1

如果它很复杂,您可能需要查看 KnockoutJs.com - 它处理视图模型与 javascript 之间的序列化,并为您完成大量工作。

于 2013-09-05T14:53:34.790 回答