2010-11-04 5 views
8

Tôi đang cố gắng tự động điền một menu thả xuống cho jqGrid khi người dùng đang chỉnh sửa dữ liệu. Tôi có nó khá nhiều làm việc tuy nhiên, có một giá trị trong các cuộc gọi thả xuống "undefined". Tôi nghi ngờ điều này là do cách tôi đang gửi dữ liệu vào lưới. Tôi đang sử dụng ASP.NET MVC 2 và tôi nhận được dữ liệu cho thả xuống bằng jQuery như vậy:

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

         } }).responseText; 

Bây giờ, jqGrid muốn các giá trị cho thả xuống được định dạng như thế này:

value: "FE:FedEx; IN:InTime; TN:TNT" 

tôi đang sử dụng StringBuilder để lặp qua bộ sưu tập của tôi và cung cấp các chuỗi thích rằng jqGrid muốn:

foreach (var q in query) 
{ 
    sb.Append("ID:"); 
    sb.Append(q.Destination); 
    sb.Append("; "); 
} 

tôi trở lại này từ bộ điều khiển của tôi như thế này:

return this.Json(sb.ToString()); 

Đây là tất cả sưng lên và tôi nhận được tất cả các mục tôi cần cho menu thả xuống nhưng có một mục bổ sung (mục cuối cùng) được gọi là "không xác định".

Tôi nghĩ vấn đề là khi tôi gỡ lỗi trong Firebug, kết quả cho jqGrid trông như thế này:

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

Xem cách có hai bộ dấu ngoặc kép. Điều này có thể vì khi tôi nói:

sb.ToString() 

Nó có thể tạo dấu ngoặc kép và sau đó jqGrid thêm tập thứ hai. Nhưng tôi không phải 100% trên đó.

Cách tốt nhất để giải quyết vấn đề này là gì? Mọi lời khuyên sẽ được đánh giá cao.

SOLUTION:.

tôi giải quyết điều này bằng cách sử dụng trở ContentResult (sb.ToString();

Tôi muốn sử dụng phương pháp dataUrl như Oleg đề cập nhưng chưa nhận rằng làm việc chưa

+0

Nếu bạn cố gắng loại bỏ dấu chấm phẩy ";" cuối cùng? Chỉ cần một ý nghĩ ... – BFree

+0

jqGrid cần dấu chấm phẩy để biểu thị mục tiếp theo trong trình đơn thả xuống. – dolphy

+0

Ok, tôi nghĩ tôi hiểu. Bán kết cuối cùng đang gây ra vấn đề. Làm việc trên nó ngay bây giờ. – dolphy

Trả lời

13

Nếu bạn cố gắng giải quyết vấn đề cho j qGrid chỉ bạn mới có thể chọn một cách khác.

Bạn có thể sử dụng các thuộc tính dataUrlbuildSelect của editoptions hoặc searchoptions thay vì value thuộc tính. Tính năng này được giới thiệu đặc biệt cho việc sử dụng trong AJAX. Các dataUrl xác định kết quả url cung cấp dưới hình thức như

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

Nếu cho bạn là easer để trả về kết quả JSON từ máy chủ chức năng buildSelect tùy chỉnh của bạn sẽ giúp đỡ. Khi tham số nhận được dữ liệu gửi từ máy chủ và nó sẽ trả về chuỗi <select><option>...</option></select>. Trong cách bạn sẽ đạt được kết quả tốt hơn.

Nếu bạn quyết định ở lại theo cách cũ của bạn, bạn nên ít nhất sửa chữa mã của bạn để sau

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

để có "FedEx:FedEx;InTime:InTime;TNT:TNT" thay vì "ID:FedEx; ID:InTime; ID:TNT; ".

CẬP NHẬT: Bạn đã yêu cầu một ví dụ nhỏ. Ví dụ, chúng ta có thể lấy tất cả các giá trị khác nhau của các chuỗi đích như là List<string> và tên của Phương thức này là GetAllDestinations. Sau đó, hành động của bạn được sử dụng bởi dataUrl thể trông giống như

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

Để sử dụng hành động này bên trong editoptions hoặc searchoptions của jqGrid bạn có thể định nghĩa về sau

{ 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>"; 
       } 
       } 
} 

Nếu bạn không muốn có các tác vụ được sử dụng cho mỗi HTTP GET bạn có thể sử dụng Json(allDestinations); thay vì Json(allDestinations, JsonRequestBehavior.AllowGet); trong hành động GetDestinationList, nhưng thêm vào danh sách tùy chọn jqGrid một tùy chọn bổ sung

ajaxSelectOptions: { type: "POST" } 

CẬP NHẬT 2: Câu trả lời đã cũ. Trong tạm thời mã của jqGrid nơi buildSelect sẽ được gọi là đã được thay đổi. Hiện tại, buildSelect sẽ được sử dụng bên trong bộ xử lý success của jQuery.ajax (xem here) thay vì trình xử lý complete trước đây (xem the postthe post chẳng hạn). Vì vậy, trong phiên bản hiện tại của jqGrid dòng

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

là không cần thiết.Các data thường là dữ liệu JSON phân tích cú pháp và do đó dòng

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

trong đoạn mã trên có thể được thay thế để

    buildSelect: function(response) { 
+0

Oleg, tôi muốn sử dụng phương thức dataUrl vì nó có vẻ là cách ưa thích theo tài liệu. Tôi đã có thể thiết lập dataUrl để sửa url vì tôi có thể thấy lưới gọi nó khi tôi nhấn nút chỉnh sửa. Tôi không chắc chắn cách thiết lập phần buildSelect. Bạn có thể cung cấp đoạn mã không? – dolphy

+0

Tôi sẽ thử vào tuần tới. Cảm ơn bạn đã giúp đỡ của bạn – dolphy

+0

Tôi cũng muốn xem đoạn mã hoạt động cho buildSelect. Nếu bạn có, xin vui lòng gửi nó ở đây hoặc gửi qua email. Cảm ơn – Anatoliy

1

vấn đề trích dẫn được cố định bằng cách này tôi tin rằng

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

này nên làm việc, dữ liệu trong trường hợp này đã được chuyển đổi qua lại m json giá trị như vậy sẽ đánh giá một chuỗi không có dấu ngoặc kép.

Nếu điều đó không làm việc sau đó thay đổi tuyên bố quay trở lại giống như thế này:

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

Yay LINQ (điều này sẽ không có các dấu ; mà tôi nghĩ là vấn đề của bạn.)

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

(có thể có lỗi chính tả mà tôi không kiểm tra)

+0

Tất cả các quyền, tôi chỉ cần làm việc ra cú pháp bây giờ. Hy vọng đăng giải pháp sớm. Cảm ơn – dolphy

+0

Tôi đã nhận được "không xác định" ra bằng cách sử dụng sb.Remove (sb.Length -2, 2) nhưng bây giờ tôi có một báo giá ở phần cuối của mục thả xuống cuối cùng. Tôi nghĩ điều này là do hai bộ trích dẫn mà tôi không biết cách loại bỏ. – dolphy

+0

Ví dụ đầu tiên ở trên làm việc cho tôi. Dường như vấn đề là với các dấu ngoặc kép được đặt xung quanh giá trị khi sử dụng responseText. Sử dụng logic ở trên không có dấu ngoặc kép nào xung quanh giá trị giải quyết vấn đề với dấu ngoặc kép ở cuối giá trị cuối cùng của tôi trong hộp kết hợp. –

2

Đây là một thay thế

[điều khiển Phương pháp]

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

[_Chọn một góc nhìn]

@model Dictionary<int, string> 
<select> 
<option value="-1">--select--</option> 
@foreach(var val in Model) 
{ 
    <option value="@val.Key.ToString()">@val.Value</option> 
} 

[Trang với jqGrid]

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

Hy vọng điều này giúp tiết kiệm giờ ai Googling!