jQuery无法识别jqGrid中的表达式错误dataUrl方法为edittype ='选择'

时间:2015-06-23 10:03:02

标签: jquery asp.net-mvc jqgrid free-jqgrid

这是this线程的延续。我正在使用 free-jqGrid 4.9.0 并进行内联编辑。

 { name: 'ContactName',  editable: true, width: 100, sortable: false, frozen: true, formatter: 'select',  edittype: 'select',
                    editoptions: {
                        dataUrl: '/InvestorList/GetContactList',
                        postData: function (rowid, value, cmName) {

                            return { projectId: rowid };
                        }
                    }

在我的ASP .NET MVC 控制器中,我有以下方法:

public JsonResult GetContactList(string projectId)
    {
        var contacts = new Dictionary<string, string>();//context.GetContactList(projectId);
        contacts.Add("123","IAM1");
        contacts.Add("1234", "IAM2");
        contacts.Add("12345", "IAM3");
        return Json(contacts, JsonRequestBehavior.AllowGet);
    }

使用IE开发人员工具,这是响应:

{"123":"IAM1","1234":"IAM2","12345":"IAM3"}

但是我收到以下错误,

  

http://localhost:51176/Scripts/jquery-2.1.3.min.js中第2行第12461行未处理的异常        0x800a139e - JavaScript运行时错误:语法错误,无法识别的表达式:{&#34; 123&#34;:&#34; IAM1&#34;,&#34; 1234&#34;:&#34; IAM2&#34;,& #34; 12345&#34;:&#34; IAM3&#34;}

我想知道dataUrl期望的格式是什么,因为我对其他列使用完全相同的格式,例如editoptions: { value: TeaserStatusList }在这种情况下,TeaserStatusList的格式与{"123":"IAM1","1234":"IAM2","12345":"IAM3"}

相同

由于

更新

{ name: 'ContactId', editable: true, width: 100, sortable: false, edittype: 'select', editoptions: {  dataUrl: '/InvestorList/GetContactList',
                        postData: function (rowid, value, cmName) {                            
                            var accid = $(gridId).jqGrid("getCell", rowid, "AccountId");
                            return { accountId: accid };
                        },
                        buildSelect: function (data) {
                            var s = "<select>";
                            data = JSON.parse(data);
                            $.each(data, function (k, v) {
                                s += '<option value="' + k + '">' + v + '</option>';
                            });
                            return s + "</select>";
                        }
                    }

1 个答案:

答案 0 :(得分:0)

jqGrid期望public class IntArrayComparer : IEqualityComparer<int[]> { public bool Equals(int[] x, int[] y) { return x.SequenceEqual(y); } public int GetHashCode(int[] x) { return x.Aggregate((t,i) => t + i.GetHashCode()); } } class Program { static void Main(string[] args) { int[] t1 = new int[] { 0, 2 }; List<int[]> trash = new List<int[]>() { t1, new int[] {0,2}, new int[] {1,0}, new int[] {1,1} }; List<int[]> trash2 = new List<int[]>() { new int[] {0,1}, new int[] {1,0}, new int[] {1,1} }; var difference = trash.Except(trash2, new IntArrayComparer()).ToArray(); } } 返回带有dataUrl语句的HTML片段。因此,您应该在<select>中添加buildSelect属性,该属性将服务器响应转换为带有editoptions语句的字符串。相应的代码可能如下所示

<select>

我没有对代码进行测试,但在我看来它与buildSelect: function (data) { var s = "<select>", i, l, val; if (data != null) { for (val in data) { if (data.hasOwnProperty(val)) { s += "<option value='" + val + "'>" + data[val] + "</option>"; } } } return s + "</select>"; } 操作返回的数据格式相对应。

我建议您在操作GetContactList的开头添加行HttpContext.Current.Response.Cache.SetMaxAge (new TimeSpan(0));,以确保您在缓存方面没有任何问题,并且每次都会调用GetContactList操作时间。