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

我正在尝试在用户编辑数据时动态填充jqGrid的下拉列表。 我有相当的工作,但下拉调用“undefined”中有一个值。 我怀疑这是因为我将数据发送到网格的方式。 我正在使用ASP.NET MVC 2,我正在使用jQuery获取下拉列表的数据,如下所示:

var destinations = $.ajax({ type:"POST", url: '', 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()); 

这都是膨胀,我获得了下拉列表所需的所有项目,但是有一个名为“undefined”的额外项目(最后一项)。

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

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

看看有两套报价。 这可能是因为当我说:

 sb.ToString() 

它可能生成引号,然后jqGrid添加第二组。 但我不是百分之百。

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

解:

我通过使用返回ContentResult(sb.ToString();

我想使用dataUrl方法作为Oleg提到但尚未完成工作。

如果你试图解决jqGrid的问题,你可以选择另一种方式。

您可以使用editoption或searchoptions的 dataUrl和buildSelect属性而不是value属性。 此function是专门为AJAX中的使用而引入的。 dataUrl以类似的forms定义url提供的结果

  

如果您更容易从服务器返回JSON结果,则自定义函数buildSelect将有所帮助。 作为参数,它接收从服务器发送的数据,它应该返回字符串 。 在你的方式你会取得更好的结果。

如果你决定坚持原来的方式,至少应该修改你的代码

 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并且此Method的名称是GetAllDestinations 。 然后, dataUrl使用的操作可能如下所示

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

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

 { name: 'destinations', ditable: true, edittype:'select', editoptions: { dataUrl:'<%= Url.Action("GetDestinationList","Home") %>', buildSelect: function(data) { var response = jQuery.parseJSON(data.responseText); var s = '"; } } } 

如果您不希望每个HTTP GET都使用动作,则可以使用Json(allDestinations); 而不是Json(allDestinations, JsonRequestBehavior.AllowGet);GetDestinationList操作中,但添加了jqGrid选项列表的附加选项

 ajaxSelectOptions: { type: "POST" } 

更新2 :答案已经过时了。 在此期间,将调用将调用buildSelect的buildSelect代码。 现在, buildSelect将在jQuery.ajaxsuccess处理程序中使用(参见此处 )而不是之前的complete处理程序(例如,参见post和post )。 所以在当前版本的jqGrid中行

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

不需要。 data通常是解析的JSON数据,因此是行

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

在上面的代码中可以替换为

  buildSelect: function(response) { 

这是另一种选择

[控制器方法]

  [HttpGet] public ActionResult SchoolList() { //Get Schools var qry = SchoolManager.GetAll(); //Convert to Dictionary var ls = qry.ToDictionary(q => q.SchoolId, q => q.Name); //Return Partial View return PartialView("_Select", ls); } 

[_选择部分视图]

 @model Dictionary  

[使用jqGrid的页面]

 { name: 'SchoolId', index: 'SchoolId', align: 'left', editable: true, edittype: 'select', editoptions: { dataUrl: '@Url.Action("SchoolList")' }, editrules: { required: true} }, 

希望这可以节省数小时的谷歌搜索!

我相信引用问题是以这种方式修复的

 $.ajax({ type:"POST", url: '<%= Url.Action("GetDestinations", "Logger") %>', dataType: "json", async: false, success: function(data) { destinations = data.value; } }); 

这应该工作,在这种情况下的数据已经从json转换,因此值将评估为没有双引号的字符串。

如果这不起作用,那么将return语句更改为如下所示:

 return "{ value : """+sb.ToString()+""" }"; 

Yay Linq(这不会有尾随;我认为这是你的问题。)

  (From q In query.AsEnumerable select "ID: "+q.Destination).join(";"); 

(可能有错字我没有测试)