La llamada a ASP.NET MVC $ .post devolviendo cadena … necesita ayuda con el formato para jqGrid

Intento rellenar dinámicamente un menú desplegable para jqGrid cuando el usuario está editando datos. Lo tengo funcionando bastante, sin embargo, hay un valor en la lista desplegable “indefinido”. Sospecho que esto se debe a la forma en que estoy enviando los datos a la red. Estoy usando ASP.NET MVC 2 y obtengo los datos para el menú desplegable usando jQuery de esta manera:

var destinations = $.ajax({ type:"POST", url: '', dataType: "json", async: false, success: function(data) { } }).responseText; 

Ahora, jqGrid quiere que los valores para el menú desplegable tengan el siguiente formato:

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

Estoy usando StringBuilder para iterar a través de mi colección y proporcionar la cadena adecuada que quiere jqGrid:

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

Devuelvo esto desde mi controlador de esta manera:

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

Esto es todo genial y obtengo todos los elementos que necesito para el menú desplegable, pero hay un artículo adicional (el último) llamado “indefinido”.

Creo que el problema es cuando depuro en FireBug, el resultado para el jqGrid se ve así:

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

Vea cómo hay dos conjuntos de citas. Esto es probablemente porque cuando digo:

 sb.ToString() 

Probablemente genere las comillas y luego jqGrid agrega un segundo conjunto. Pero no estoy 100% en eso.

¿Cuál es la mejor manera de lidiar con esto? Cualquier consejo sería muy apreciado.

SOLUCIÓN:

Lo resolví utilizando return ContentResult (sb.ToString ();

Me gustaría utilizar el método dataUrl como lo mencionó Oleg, pero todavía no lo he conseguido.

Si intentas resolver el problema solo para jqGrid, puedes elegir otra opción.

Puede usar las propiedades dataUrl y buildSelect de editoptions o searchoptions en lugar de propiedad de value . Estas características se introducen especialmente para el uso en AJAX. El dataUrl define los resultados provistos url en la forma como

  

Si para usted es más fácil devolver los resultados JSON del servidor, su función personalizada buildSelect ayudará. Como parámetro recibe el envío de datos del servidor y debe devolver la cadena . En la forma en que logrará mejores resultados.

Si decides mantenerte como antes, al menos deberías corregir tu código para seguirlo

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

tiene "FedEx:FedEx;InTime:InTime;TNT:TNT" lugar de "ID:FedEx; ID:InTime; ID:TNT; " .

ACTUALIZADO : Pediste un pequeño ejemplo. Permítanos, por ejemplo, obtener todos los valores diferentes de las cadenas de destinos como List y el nombre de este Método es GetAllDestinations . Entonces su acción utilizada por dataUrl puede verse como

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

Para usar esta acción dentro de editoptions o searchoptions de jqGrid puedes definir sobre seguir

 { name: 'destinations', ditable: true, edittype:'select', editoptions: { dataUrl:'< %= Url.Action("GetDestinationList","Home") %>', buildSelect: function(data) { var response = jQuery.parseJSON(data.responseText); var s = '"; } } } 

Si no desea tener acciones que se utilicen por HTTP GET, puede usar Json(allDestinations); en lugar de Json(allDestinations, JsonRequestBehavior.AllowGet); en la acción GetDestinationList , pero agrega a la lista de opciones de jqGrid una opción adicional

 ajaxSelectOptions: { type: "POST" } 

ACTUALIZADO 2 : La respuesta ya es vieja. Mientras tanto, se modificó el código de jqGrid donde se buildSelect . Ahora el buildSelect se usará dentro del controlador de success de jQuery.ajax (ver aquí ) en lugar del controlador complete anterior (ver la publicación y la publicación, por ejemplo). Entonces, en la versión actual de jqGrid, la línea

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

no es necesario. Los data suelen ser los datos JSON analizados y, por lo tanto, las líneas

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

en el código anterior puede ser reemplazado por

  buildSelect: function(response) { 

Esta es otra alternativa

[Método del controlador]

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

[_Seleccione vista parcial]

 @model Dictionary  

[Página con jqGrid]

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

Espero que esto le ahorre a alguien horas de Google.

El problema de la cita se soluciona de esta manera, creo

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

Esto debería funcionar, los datos en este caso se han convertido de json, por lo que el valor se evaluará en una cadena sin las comillas dobles.

Si eso no funciona, cambie la statement de devolución para que se vea así:

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

Yay Linq (esto no tendrá el final ; que creo que es tu problema).

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

(podría tener errores tipográficos que no probé)