c# - tag - ASP.NET MVC $.post вызов возвращающей строки... нужна помощь с форматом для jqGrid



asp.net-mvc jquery (2)

Я пытаюсь динамически заполнить раскрывающийся список для 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());

Это все разбухает, и я получаю все элементы, которые мне нужны для выпадающего списка, но есть дополнительный элемент (последний), называемый «undefined».

Я думаю, проблема в том, что когда я отлаживаю FireBug, результат для jqGrid выглядит так:

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

Посмотрите, как есть два набора котировок. Вероятно, это потому, что, когда я говорю:

sb.ToString()

Вероятно, он генерирует кавычки, а затем jqGrid добавляет второй набор. Но я не на это 100%.

Каков наилучший способ справиться с этим? Любые советы будут очень признательны.

РЕШЕНИЕ:

Я решил это, используя return ContentResult (sb.ToString ();

Я хотел бы использовать метод dataUrl, как сказал Олег, но пока не работает.


Answer #1

Таким образом, проблема цитат исправлена.

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

Это должно работать, данные в этом случае были преобразованы из json, поэтому значение будет оцениваться в строке без двойных кавычек.

Если это не сработает, измените оператор return, чтобы он выглядел следующим образом:

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

Yay Linq (у этого не будет конечности ; я думаю, что это ваша проблема).

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

(возможно, опечатки я не тестировал)


Answer #2

Это еще одна альтернатива

[Метод контроллера]

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

Надеюсь, это сэкономит кому-то часы в Гуглинге!