0

在 Page_Load 我得到的数据像

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

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

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

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

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

- 更新 -

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

4

2 回答 2

1

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

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

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

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

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

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

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

更新

我只记得 WebForms 有一个“文字”控件,这很可能是您想要的,以符合约定。像这样的东西,也许:

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

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

于 2013-03-08T00:34:52.517 回答
0

创建要发送到 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 页面。

于 2013-03-08T00:15:29.900 回答