jqGrid使用可空列保存行

时间:2011-02-17 21:47:09

标签: jqgrid asp.net-mvc-3 nullable

所以我在ASP.NET MVC 3网站上有一个jqGrid。它使用内置的弹出编辑器加载数据,搜索,过滤和保存行。我无法工作的是保存一个可以为空的财产。我正在使用LargeJsonResult而不是内置的JsonResult,因此网格中的一行示例如下:

// C# class
public class Row
{
    public string A { get; set; }
    public string B { get; set; }
    public int C { get; set; }
}

// an example object instance, let's say these values come from the DB
var ret = new Row { A = "a", B = null, C = 5 };

// the JSON string sent to the grid will look like this (notice B is omitted)
// "{ A: 'a', C: 5 }"

现在,网格将显示为:

A   B          C
a   undefined  5

这让我想到了我的问题。弹出编辑表单将在B的文本框中显示“undefined”,并且还会将其发布到服务器。因此,如果我将其保存到数据库中,我将在数据库中使用“undefined”而不是null。

如何让jqGrid保持空值往返?在我看来非常讨厌的一个解决方案是基于Oleg在另一个线程中解决的问题:

// override jqGrid serialization
jQuery.extend(jQuery.jgrid.edit, { ajaxEditOptions: { contentType: "application/json" }, serializeEditData: function (data) {
    return JSON.stringify(data).replace(/"undefined"/g, 'null');
}});

这样可行,但似乎很危险,因为它在用户不知情的情况下对数据进行了大量编辑。在考虑更多关于它的时候,我想这是保存回null而不是“undefined”或其他字符串表示null(空字符串等)的基本问题。期望的行为是:

  • 如果属性为null,并且用户未更改该值,则会将其发布为null
  • 如果用户更改了值,则该属性不再为null

我们可以让网格的编辑表单对于可空属性这样表现吗?或者我是否必须创建一个自定义编辑表单来跟踪用户对属性的处理方式?

1 个答案:

答案 0 :(得分:2)

我希望我理解你的问题。在我使用jqGrid的一个应用程序中,我曾经遇到过NULL值的问题。在开发应用程序时,我不确定如何解决问题,我在服务器端放置了文本值“(NULL)”而不是一个属性的null值。网格适用于了解“(NULL)”是什么的高级用户。值“(NULL)”在字段中没有意义(一个没有名称的用户帐户)和编辑操作的服务器代码内部我可以将“(NULL)”值与实际字段值区分开来。我可以解决这个问题。

在你的情况下,你应该解决至少两个问题:

  1. 您应该决定null显示的方式。 “未定义”的文字似乎不是最好的。您可以使用服务器端的“未定义”文本(就像我在我的情况下那样)或custom formatter来解决问题。 custom formatter非常简单。它定义了单元格值应如何显示为<td>包含的HTML片段。例如,您可以添加其他隐藏的<span>元素或其他HTML元素或属性,以保存值为null的信息。
  2. 您应该在编辑操作期间使用服务器端的null值的解码解决问题。您可以在服务器端轻松解决问题(就像我将相应字段与“(NULL)”进行比较)或在客户端使用custom unformattercustom unformatter将从网格单元格中获取信息(来自隐藏的<span>或其他隐藏的HTML元素或属性),并将信息放入服务器请求中。
  3. 您可以查看the demo the answer查看示例,了解如何使用隐藏的<span>custom formattercustom unformatter的单元格中保存其他信息稍后阅读有关{{3}}的信息。