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

时间:2010-11-04 20:35:07

标签: c# asp.net-mvc jquery jqgrid

我正在尝试在用户编辑数据时动态填充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());

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

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

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

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

sb.ToString()

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

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

解决方案:

我通过使用来解决这个问题     返回ContentResult(sb.ToString();

我想像Oleg所提到的那样使用dataUrl方法,但尚未开始工作。

3 个答案:

答案 0 :(得分:13)

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

您可以使用dataUrlbuildSelecteditoptionssearchoptions属性,而不是value属性。此功能专门针对AJAX中的使用而引入。 dataUrl定义了网址提供的结果,如

<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);操作中使用Json(allDestinations, JsonRequestBehavior.AllowGet);而不是GetDestinationList,但添加到jqGrid选项列表中附加选项

ajaxSelectOptions: { type: "POST" }

更新2 :答案已经过时了。在此期间,将调用buildSelect将被调用的jqGrid代码。现在buildSelect将在success的{​​{1}}处理程序中使用(请参阅here)而不是jQuery.ajax处理程序(请参阅the post和例如the post)。所以在当前版本的jqGrid中行

complete

不需要。 var response = jQuery.parseJSON(data.responseText); 通常是已解析的JSON数据,因此行

data
上面的代码中的

可以替换为

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

答案 1 :(得分:2)

这是另一种选择

[控制器方法]

  [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<int, string>
<select>
<option value="-1">--select--</option>
@foreach(var val in Model)
{
    <option value="@val.Key.ToString()">@val.Value</option>
}

[使用jqGrid的页面]

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

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

答案 2 :(得分:1)

引用问题以我认为的方式修复

$.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(";");

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