ASP.NET MVC $ .post вызов возврата строки ... нужна помощь с форматом для jqGrid - PullRequest
8 голосов
/ 04 ноября 2010

Я пытаюсь динамически заполнить раскрывающийся список для 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, как упомянул Олег, но пока что это не работает.

Ответы [ 3 ]

13 голосов
/ 05 ноября 2010

Если вы попытаетесь решить проблему только для jqGrid, вы можете выбрать другой способ.

Вы можете использовать dataUrl и buildSelect свойства editoptions или searchoptions вместо value свойство.Эти функции введены специально для использования в AJAX. dataUrl определяет предоставленные URL-адреса в форме, подобной

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

Если вам проще вернуть результаты JSON с сервера, ваша пользовательская функция buildSelect поможет.В качестве параметра он получает данные, отправленные с сервера, и должен вернуть строку <select><option>...</option></select>.Таким образом, вы достигнете лучших результатов.

Если вы все-таки решите остаться на прежнем уровне, вы должны по крайней мере исправить свой код так, чтобы он следовал

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

, чтобы иметь "FedEx:FedEx;InTime:InTime;TNT:TNT" вместо"ID:FedEx; ID:InTime; ID:TNT; ".

ОБНОВЛЕНО : Вы попросили небольшой пример.Допустим, вы можете, например, получить все различные значения строк назначения как List<string>, а имя этого метода - GetAllDestinations.Тогда ваше действие, используемое dataUrl , может выглядеть как

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

Чтобы использовать это действие внутри editoptions или searchoptions jqGrid, которые вы можете определитьо следующих

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

Если вы не хотите иметь действия, которые будут использоваться для HTTP GET, вы можете использовать Json(allDestinations); вместо Json(allDestinations, JsonRequestBehavior.AllowGet); в действии GetDestinationList, но добавить в список jqGridопции дополнительная опция

ajaxSelectOptions: { type: "POST" }

ОБНОВЛЕНО 2 : Ответ уже старый.Тем временем код jqGrid, где будет вызываться buildSelect, был изменен.Теперь buildSelect будет использоваться внутри обработчика success jQuery.ajax (см. здесь ) вместо обработчика complete ранее (см. сообщение и пост например).Поэтому в текущей версии jqGrid строка

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

не нужна.data - это обычно анализируемые данные JSON, поэтому строки

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

в приведенном выше коде можно заменить на

                 buildSelect: function(response) {
2 голосов
/ 11 октября 2011

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

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

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

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

1 голос
/ 04 ноября 2010

Проблема с кавычками устранена таким образом, я полагаю

$.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(";");

(могут быть опечатки, которые я не проверял)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...