【问题标题】:ASP.NET MVC $.post call returning string...need help with format for jqGridASP.NET MVC $.post 调用返回字符串...需要 jqGrid 格式的帮助
【发布时间】:2011-05-05 07:21:39
【问题描述】:

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

我像这样从我的控制器返回这个:

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 需要分号来表示下拉列表中的下一项。
  • 好的,我想我明白了。最后一个分号导致了问题。现在正在努力。

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


【解决方案1】:

我相信报价问题是这样解决的

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

这应该可行,在这种情况下,数据已从 json 转换,因此 value 将评估为不带双引号的字符串。

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

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

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

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

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

【讨论】:

  • 好吧,我现在正在研究语法。希望尽快发布解决方案。谢谢
  • 我通过使用 sb.Remove(sb.Length -2, 2) 得到了“未定义”,但现在我在最后一个下拉项的末尾有一个引号。我认为这是因为我还不知道如何摆脱的两组引号。
  • 上面的第一个例子对我有用。似乎问题出在使用 responseText 时值周围的双引号。使用上面的逻辑,值周围没有双引号,这解决了组合框中最后一个值末尾的双引号问题。
【解决方案2】:

如果您尝试只为 jqGrid 解决问题,您可以选择其他方式。

您可以使用editoptionssearchoptionsdataUrlbuildSelect 属性来代替value 属性。此功能是专门为在 AJAX 中使用而引入的。 dataUrl 定义了 url 提供的结果,格式如下:

<select><option value="1">One</option> <option value="2">Two</option></select>

如果您更容易从服务器返回 JSON 结果,您的自定义函数 buildSelect 将有所帮助。作为参数它接收从服务器发送的数据,它应该返回字符串&lt;select&gt;&lt;option&gt;...&lt;/option&gt;&lt;/select&gt;。这样你会取得更好的结果。

如果您决定继续使用旧方法,您至少应该将您的代码修复为以下内容

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);
}

to 有 "FedEx:FedEx;InTime:InTime;TNT:TNT" 而不是 "ID:FedEx; ID:InTime; ID:TNT; "

已更新:您要求举一个小例子。例如,让我们您可以将目标字符串的所有不同值作为List&lt;string&gt; 获取,并且此方法的名称是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 都使用操作,您可以在 GetDestinationList 操作中使用 Json(allDestinations); 而不是 Json(allDestinations, JsonRequestBehavior.AllowGet);,但在 jqGrid 选项列表中添加一个附加选项

ajaxSelectOptions: { type: "POST" }

更新 2:答案已经很老了。在此期间,将调用 buildSelect 的 jqGrid 代码已更改。现在buildSelect 将在jQuery.ajaxsuccess 处理程序中使用(参见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) {

【讨论】:

  • Oleg,我想使用 dataUrl 方法,因为根据文档,它似乎是首选方法。我能够将 dataUrl 设置为正确的 url,因为当我点击编辑按钮时,我可以看到网格调用它。我不确定如何设置 buildSelect 部分。可以给个代码sn-p吗?
  • 下周我会试试这个。谢谢楼主的帮助
  • 我也有兴趣看到 buildSelect 的工作 sn-p。如果您有,请在此处发布或通过电子邮件发送。谢谢
  • @Anatoliy:对不起,我现在很忙:我在客户那里出差。所以我上次发的很少。
  • @Oleg:是的,我明白了,毫无疑问,客户的优先级最高。
【解决方案3】:

这是另一种选择

[控制器方法]

  [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} },

希望这可以节省人们在谷歌上搜索的时间!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多