一尘不染

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

c#

我正在尝试在用户编辑数据时动态填充jqGrid的下拉列表。我有很多工作,但是,在下拉调用“
undefined”中有一个值。我怀疑这是因为我将数据发送到网格的方式。我正在使用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("; ");
}

我从控制器这样返回:

return this.Json(sb.ToString());

这一切都膨胀了,我得到了下拉菜单所需的所有项目,但是还有一个额外的项目(最后一个)称为“未定义”。

我认为问题是在FireBug中调试时,jqGrid的结果如下所示:

value: ""ID: One;ID: Two;ID: Three;ID: Four;ID: Five;""

看看有两套引号。这可能是因为当我说:

sb.ToString()

它可能会生成引号,然后jqGrid添加第二组。但我不是100%。

处理此问题的最佳方法是什么?任何建议将不胜感激。

解:

我通过使用return ContentResult(sb.ToString();)解决了这个问题

我想使用Oleg提到的dataUrl方法,但尚未实现。


阅读 327

收藏
2020-05-19

共1个答案

一尘不染

如果仅尝试解决jqGrid的问题,则可以选择另一种方法。

您可以使用dataUrlbuildSelect的性质editoptionssearchoptions,而不是value财产。专门针对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。然后,dataUrl使用的操作看起来像

public JsonResult GetDestinationList() {
    List<string> allDestinations = GetAllDestinations();
    Json(allDestinations, JsonRequestBehavior.AllowGet);
}

要在jqGrid的editoptionssearchoptions中使用此操作,您可以定义以下内容

{ 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);而不是使用,但可以在jqGrid选项列表中添加一个附加选项Json(allDestinations, JsonRequestBehavior.AllowGet);``GetDestinationList

ajaxSelectOptions: { type: "POST" }

更新2
:答案已经很旧了。在此期间,buildSelect将调用jqGrid的代码已更改。现在,buildSelect将在(参见此处)的success处理程序内部而不是之前的处理程序中使用(例如,参见postpost)。因此,在当前版本的jqGrid中,jQuery.ajaxcomplete

var response = jQuery.parseJSON(data.responseText);

不需要。的data是典型地解析的JSON数据等的线

                 buildSelect: function(data) {
                     var response = jQuery.parseJSON(data.responseText);

上面的代码中可以替换为

                 buildSelect: function(response) {
2020-05-19