c# - ASP.NET MVC $.post 调用返回字符串...需要有关 jqGrid 格式的帮助

标签 c# asp.net-mvc jquery jqgrid

我正在尝试在用户编辑数据时动态填充 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 的问题,您可以选择其他方式。

您可以使用 dataUrlbuildSelect 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 postthe 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/

相关文章:

c# - 对 ViewModel 属性进行修饰以使用不同的名称进行绑定(bind)

c# - 正则表达式匹配未完成

c# - 作为方法参数的函数

asp.net-mvc - 通过 Post 和 ASP.NET MVC 上传 Amazon S3

asp.net-mvc - 当MVC和Web API在不同的项目中时如何存储不记名 token

javascript - 如何在 JSFiddle 上创建具有可调整大小的行和列(如 HTML、CSS、JS 框)的表格?

javascript - 单击 nav-pills 时 Bootstrap 中的选项卡式下拉菜单不断关闭

javascript - 构建 MVC Controller 的 POST url

asp.net-mvc - UserManager.FindAsync 总是返回 null

jquery - 使用 Select2 包裹选定的文本