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.ajax
的success
处理程序中使用(参见此处 )而不是之前的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(";");
(可能有错字我没有测试)