c# - into - razor tutorial




ASP.NET MVC $.stata di ritorno chiamata di string... ha bisogno di aiuto con il formato per jqGrid (2)

Sto cercando di popolare in modo dinamico un menu a discesa per jqGrid quando l'utente sta modificando i dati. Comunque funziona abbastanza, c'è un valore nella chiamata a cascata "indefinito". Sospetto che ciò sia dovuto al modo in cui sto inviando i dati alla griglia. Sto usando ASP.NET MVC 2 e sto ottenendo i dati per il menu a discesa usando jQuery in questo modo:

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

                         } }).responseText;

Ora, jqGrid vuole che i valori per il menu a discesa siano formattati in questo modo:

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

Sto usando StringBuilder per scorrere la mia collezione e fornire la stringa corretta che jqGrid vuole:

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

Lo restituisco dal mio controller in questo modo:

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

Questo è tutto eccezionale e ottengo tutti gli elementi di cui ho bisogno per il menu a discesa, ma c'è un oggetto in più (l'ultimo) chiamato "non definito".

Penso che il problema sia quando eseguo il debug in FireBug, il risultato per jqGrid è simile al seguente:

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

Guarda come ci sono due serie di citazioni. Questo è probabilmente perché quando dico:

sb.ToString()

Probabilmente genera le virgolette e quindi jqGrid aggiunge un secondo set. Ma non sono al 100% su questo.

Qual è il modo migliore per affrontare questo? Qualsiasi consiglio sarebbe molto apprezzato.

SOLUZIONE:

Ho risolto questo problema utilizzando return ContentResult (sb.ToString ();

Vorrei usare il metodo dataUrl come menzionato da Oleg, ma non ho ancora funzionato.


Questa è un'altra alternativa

[Metodo controller]

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

[_Seleziona vista parziale]

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

[Pagina con jqGrid]

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

Spero che questo salvi qualcuno ore di Google!


Il problema del preventivo è stato fissato in questo modo credo

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

Questo dovrebbe funzionare, i dati in questo caso sono stati convertiti da json, quindi il valore valuterà una stringa senza le virgolette.

Se ciò non funziona, modifica l'istruzione return in modo che assomigli a questo:

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

Yay Linq (questo non avrà il trailing ; che credo sia il tuo problema).

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

(potrebbe avere errori di battitura che non ho provato)





jqgrid