【问题标题】:Best practices for passing data from asp.net-mvc to javascript将数据从 asp.net-mvc 传递到 javascript 的最佳实践
【发布时间】:2010-11-14 21:20:23
【问题描述】:

我最近一直在使用 ASP.NET MVC 和 Javascript/jQuery,我似乎正朝着我总是需要将一些动态值“传递给”我的 javascript 的方向前进。当脚本在页面中时,我做了这样的事情:

var isEditable = <%=ViewData["editable"]%>

我喜欢这种快速和简单的方式,就像我在 HTML 中注入一个值一样。但这闻起来。真的,真的很糟糕。而且它破坏了 Visual Studio 的智能感知和代码格式,使我的脚本难以阅读和理解。

我想到另一个解决方案是将我的数据传递到隐藏字段,并使用 Javascript 引用...

<input type="hidden" id="editable" value="<%=ViewData["editable"]%>" />
var isEditable = $("#editable").attr("value");

这可能要好得多,因为它可以保持脚本完整,并允许我将其移动到外部 .js 文件。但是这个解决方案的某些方面似乎也不理想。还是只有我一个人?

谁能推荐将数据传递到脚本中的解决方案和最佳实践?如果我的脚本一开始就严重依赖来自控制器的视图数据,我是否走错了路?

【问题讨论】:

  • 使用 AJAX 将模型中的数据“拉”到控制器中的某种数据存储中怎么样?
  • 我认为 AJAX 在我所指的案例类型中会过分杀伤力......我的脚本通常只需要知道来自控制器/模型的一些数据(已经存在的数据在初始页面执行时),因此发出另一个网络回调控制器似乎有点多。

标签: javascript jquery asp.net-mvc


【解决方案1】:

我有时会通过 JSON 序列化程序将配置对象写入页面,从而将数据传递到我的页面:

var pageConfig = <%= ServerConfig.ToJson() %>;

需要自己编写 ToJson 方法的地方。这样可以很好地包含页面状态,因此只有一个地方可以注入服务器值。从这里开始的一切都是纯javascript。在您的示例中,您可以这样做:

var isEditable = pageConfig.isEditable;

即使在外部 js 文件中,如果 pageConfig 是全局的。不过,在这种情况下,您应该正确命名它:MY_APP.pageConfig 也许。

【讨论】:

  • 这不影响chacheability吗?至少每个页面 GET 可能会返回不同的页面(不同的配置)。在考虑代理服务器中的缓存时,现在您将为每个用户拥有该页面的不同版本。这有什么问题吗?
  • 这是一个有趣的选项,但我不确定我是否完全理解你是如何实现这个 ServerConfig 类的。确实每个页面GET可能返回一组不同的数据,那么pageConfig最终不是需要从每个页面的ViewData中设置吗?无论如何,您的其他建议是我一定会尝试/考虑的(Json 和全局 js 变量)-谢谢!
  • @Kurt - 是的,我认为您必须从 ViewData 构建它(也许作为匿名类型)。我并不是说您可以摆脱 ViewData,而是您可以限制在页面上注入服务器数据的位置。
【解决方案2】:

您将以一种或另一种方式注入该信息。 IMO,您的第一个示例与第二个示例并没有什么不同。

另一个解决方案是拥有一个接受选项对象的 JS 类(或原型?)。尽管不可否认,它与您给出的示例并没有真正的不同。但是,也许你想走这条路。

$(function () {
    myClass.init({ isEditable: <%=ViewData["editable"]%>, 
        another: '<%=ViewData["another"]%>' });
});

【讨论】:

    【解决方案3】:

    我认为@çağdaş 提出了一个很好的观点,但请记住也要检查服务器端。如果您将字段设置为“只读”,则不会阻止用户修改该标志、更改只读字段并提交。

    【讨论】:

      【解决方案4】:

      Ajax 的整个业务就是异步加载信息。如果您正在做 Ajax 的工作(加载信息并将其保存在一个变量中),那就是从它身上夺走了权力。您为什么不尝试使用 JQuery 并使用它的 Ajax 或 Get 函数来动态加载内容。这将有助于您的页面加载更快。

      【讨论】:

        猜你喜欢
        • 2016-12-27
        • 2015-03-22
        • 2020-08-07
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        相关资源
        最近更新 更多