我正在尝试在用户编辑数据时动态填充 jqGrid 的下拉列表。我已经很好地工作了,但是,下拉列表中有一个值称为“未定义”。我怀疑这是因为我将数据发送到网格的方式。我正在使用 ASP.NET MVC 2,我正在使用 jQuery 获取下拉列表的数据,如下所示:
var destinations = $.ajax({ type:"POST",
url: '<%= Url.Action("GetDestinations", "Logger") %>',
dataType: "json",
async: false,
success: function(data) {
} }).responseText;
现在,jqGrid 想要下拉列表的值格式如下:
value: "FE:FedEx; IN:InTime; TN:TNT"
我正在使用 StringBuilder 遍历我的集合并提供 jqGrid 需要的正确字符串:
foreach (var q in query)
{
sb.Append("ID:");
sb.Append(q.Destination);
sb.Append("; ");
}
我像这样从我的 Controller 返回这个:
return this.Json(sb.ToString());
一切都很好,我得到了下拉列表所需的所有项目,但还有一个名为“未定义”的额外项目(最后一个)。
我认为问题是当我在 FireBug 中调试时,jqGrid 的结果如下所示:
value: ""ID: One;ID: Two;ID: Three;ID: Four;ID: Five;""
看看怎么会有两组引号。这可能是因为当我说:
sb.ToString()
它可能会生成引号,然后 jqGrid 添加第二组。但我不是 100% 同意这一点。
处理此问题的最佳方法是什么?任何建议将不胜感激。
解决方案:
我通过使用解决了这个问题 返回 ContentResult(sb.ToString();
我想使用 Oleg 提到的 dataUrl 方法,但还没有让它工作。
最佳答案
如果您尝试解决仅 jqGrid 的问题,您可以选择其他方式。
您可以使用 dataUrl和 buildSelect editoptions 的属性或 searchoptions而不是 value
属性(property)。此功能是专门为在 AJAX 中使用而引入的。 dataUrl以如下形式定义 url 提供的结果
<select><option value="1">One</option> <option value="2">Two</option></select>
如果您更容易从服务器返回 JSON 结果,您的自定义函数 buildSelect会有所帮助。作为参数,它接收从服务器发送的数据,它应该返回字符串 <select><option>...</option></select>
.在这种情况下,您将获得更好的结果。
如果您决定保留旧方式,您至少应该将代码修改为以下
foreach (var q in query)
{
if (sb.Length != 0)
sb.Append(';');
sb.Append(q.Destination); // instead of sb.Append("ID");
sb.Append(':');
sb.Append(q.Destination);
}
有"FedEx:FedEx;InTime:InTime;TNT:TNT"
而不是 "ID:FedEx; ID:InTime; ID:TNT; "
.
已更新:您要求提供一个小示例。例如,让我们可以将目标字符串的所有不同值作为 List<string>
获取。此方法的名称是 GetAllDestinations
.那么你的 Action 被dataUrl使用了可以看起来像
public JsonResult GetDestinationList() {
List<string> allDestinations = GetAllDestinations();
Json(allDestinations, JsonRequestBehavior.AllowGet);
}
在 editoptions 中使用此操作或 searchoptions jqGrid 的你可以定义如下
{ name: 'destinations', ditable: true, edittype:'select',
editoptions: { dataUrl:'<%= Url.Action("GetDestinationList","Home") %>',
buildSelect: function(data) {
var response = jQuery.parseJSON(data.responseText);
var s = '<select>';
if (response && response.length) {
for (var i = 0, l=response.length; i<l ; i++) {
var ri = response[i];
s += '<option value="'+ri+'">'+ri+'</option>';
}
}
return s + "</select>";
}
}
}
如果您不想让每个 HTTP GET 使用操作,您可以使用 Json(allDestinations);
而不是 Json(allDestinations, JsonRequestBehavior.AllowGet);
在GetDestinationList
操作,但向 jqGrid 选项列表添加一个附加选项
ajaxSelectOptions: { type: "POST" }
更新 2:答案已经很旧了。在此期间,jqGrid 的代码在哪里 buildSelect
将被称为被改变。现在 buildSelect
将在 success
中使用jQuery.ajax
的处理程序(参见 here )而不是 complete
处理程序之前(参见 the post 和 the post 例如)。所以在当前版本的 jqGrid 中,行
var response = jQuery.parseJSON(data.responseText);
不需要。 data
通常是解析的 JSON 数据,所以行
buildSelect: function(data) {
var response = jQuery.parseJSON(data.responseText);
上面代码中可以替换为
buildSelect: function(response) {
关于c# - ASP.NET MVC $.post 调用返回字符串...需要有关 jqGrid 格式的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4101116/