【问题标题】:Passing recordset from C# code-beind into aspx page as Json将记录集从 C# 代码隐藏传递到 aspx 页面作为 Json
【发布时间】:2013-03-07 23:59:49
【问题描述】:

在 Page_Load 我正在获取类似的数据

var products = BLL.Presenters.Products.GetAll();

如果大约有 10 个产品,它会返回一个列表。

我想将该产品列表作为 json 传递到 aspx 页面,然后使用 JSON 对象执行一些客户端操作。

如何在不使用隐藏字段的情况下将 JSON 对象从代码隐藏中的记录集中传递到 aspx 页面?

p.s 我们已经在使用来自其他 JSON 内容的 Newtonsoft.Json 库。

- 更新-

我无法让这个工作。我现在在 JS 中执行 ajax 调用(无代码隐藏)并获取所需的数据。

【问题讨论】:

  • 您是否使用 AJAX 执行此操作?
  • JsonConvert.SerializeObject 方法不适合你吗?
  • 否 - 我们想将 json 从代码隐藏“加载”到 aspx 页面中。我们在代码隐藏中有 JSON 对象,但是我们如何将它传递给 aspx 页面?
  • 如果您不使用 AJAX 执行此操作,您希望通过使用 JSON 和“然后做一些客户端的事情”来获得什么好处?在这里不和你争论,我只是想充分了解你的用例。
  • @TheGreatCO:我认为他的问题是如何将 JSON 传递给页面...... 不使用 使用隐藏字段

标签: asp.net json client-side json.net


【解决方案1】:

将一段 JSON 传递给页面的一种方法是直接在页面上呈现它。

<script type="text/javascript">
    var myData = <%= MyJsonString %>;
</script>

MyJsonString 上面是代码隐藏类的属性,它包含序列化的对象结构作为 JSON 数据字符串。如果您愿意,它可以是一个方法调用。无论哪种方式,它都必须能够在调用页面的渲染方法之前返回 JSON 字符串。

显然,您需要将其加载到适合您的应用程序的位置。如果我这样做,它通常是在一个小函数内,所以它不是全局的,它在实际使用数据的某个地方调用 .js 文件中的另一个函数。

还要注意字符串呈现后的分号(尽管我相信分号在 javaScript 中并不是绝对必要的,但我的老 C/C++/C# 程序员似乎无法放弃它们。 )

请注意,它使用&lt;%= %&gt; 进行渲染,因此不会发生 HTML 编码。这很重要,否则 JSON 字符串会出现乱码,并且在脚本块中没有任何意义。

最后,我已经有几年没有做过 WebForms 开发了,所以我可能对一些细节感到生疏——我希望以上内容对你有意义并且对你有用。

更新

我只记得 WebForms 有一个“文字”控件,这很可能是您想要的,以符合惯例。可能是这样的:

<script type="text/javascript">
    var myData = <asp:Literal runat="server" id="MyJsonLiteralControl" />;
</script>

在您后面的代码中,将文字控件的 Text 设置为您生成的 JSON 字符串。

【讨论】:

  • 谢谢,我们试图避免只写页面。我希望将数据包含在“js 对象”中。我们过去曾使用过隐藏字段。看起来很草率..
  • 您的问题仅表明您不想在页面上放置隐藏字段。如果您根本不想写入页面,则需要 AJAX 调用。我不知道您所说的“js 对象”是什么意思,当它解析它所在的脚本块时,JSON 字符串将被解释为 javascript 对象。
【解决方案2】:

创建要发送到 ASPX 页面的对象的视图模型。这可以与您的正常运行时代码中使用的类完全相同。一旦你有了这个类,你就可以使用 AutoMapper 从一个对象类转换到另一个对象类。然后,您可以将这个新映射的对象添加到您的返回视图中。

var products = BLL.Presenters.Products.GetAll().ToList();
Mapper.CreateMap<Products, ProductsViewModel>()
var output = Mapper.Map<IEnumerable<Products>, List<ProductsViewModel>>(products);
return View("Index", output);

您的 ViewModel 类应该如下所示。

public class ProductsViewModel
{
      public string Name {get; set;}
      public string UPC {get; set;}
      public double? Price {get; set;}
}

我假设您有更多字段,但这只是为了说明。如果您将 ViewModel 类中的字段命名为与主对象类中的相同,AutoMapper 将自动从一种类型转换为另一种类型,从而使您只需将对象通过 ViewBag 推送到您的 ASPX 页面。

【讨论】:

  • @TheGreatOC : 'return View("Index", output); '
  • @DavidKEgghead 在这种情况下,我相信您必须在页面加载时使用某种 AJAX 请求来获取信息,或者使用隐藏字段将其嵌入页面中。我不知道将 JSON 发送到页面的任何其他方法。
猜你喜欢
  • 1970-01-01
  • 2015-10-20
  • 2015-07-02
  • 2011-11-12
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多