2016-09-20 4 views
2

Я пытаюсь сделать некоторый абстрактный класс для всех контроллеров сетки. Поскольку все контроллеры будут иметь одно и то же GridViewPartial Action, но с разными параметрами, я решил создать struct ActionParams с свойством Args, чтобы сохранить все входные параметры. Так вот моя структура:Объект Devexpress MVC как аргумент обратного вызова

public struct ActionParams 
     { 
      public Dictionary<string, object> Args { get; set; } 

     } 

И контроллер действия

public ActionResult GridViewPartial(ActionParams input) { } 

Проблема заключается в функции JS onBeginCallback. Я пытался выполнить эту задачу в 2-мя способами:

1)

function onBeginCallback(s, e) 
{ 
        e.customArgs["Args"]={"value1":1,"value2":2}; 
} 

Вместо того, чтобы строка ключа и значение INT, я строка ключа и строка [] значение. Насколько я понимаю, это проблема сериализации.

2)

function onBeginCallback(s, e) 
    { 
     var editorsNames = {"value1":1),"value2":2} 
     e.customArgs["Args"] = $.toJSON(editorsNames); 
    } 

Таким образом, я получил пустой Args. Но объект в Request.Params так что я получил в следующим образом:

public ActionResult GridViewPartial(ActionParams input) 
     { 

      string jsonText = Request.Params["Args"]; 
      if (string.IsNullOrEmpty(jsonText)) 
      { } 
      else 
      { 
       ActionParams data = new ActionParams>(); 
       try 
       { 
        data.Args = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Dictionary<string,int>>(jsonText); 
       } 
       catch 
       { 
        ViewData["ErrorMessage"] = "Incorrect data"; 
       } 
      } 

     } 

Теперь мне интересно, если это возможно, чтобы отправить этот объект JSON непосредственно input.Args, как это было в случае 1? (для простого jquery ajax все работает нормально).

Надеюсь, что кто-то с отличными выражениями управления MVC devexpress даст мне хороший совет.

ответ

1

По How to pass complex types to the server with a callback customArgs argument:

При создании объекта и передать его e.customArgs аргумент, наш код не сериализации объекта в строку, и, таким образом, вы не получить на стороне клиента объект на стороне сервера правильно.

Первая попытка показать, как сырье объект JSON передается в контроллер с помощью console.log(e.customArgs) показывает эту структуру объекта в консоли:

Object { Args: Object {"value1": 1, "value2": 2}} 

Когда входной параметр Args, назначенный в качестве Dictionary<String, int>, кажется, я был в состоянии захватить оба ключа и значения в объекте JSON по этому коду:

public ActionResult GridViewPartial(Dictionary<String, int> Args) 
{ 
    // Args parameter contains 2 arrays with Count = 2 
    // Args.Keys contains "value1" and "value2" 
    // Args.Values contains 1 and 2 
    foreach (String key in Args.Keys) 
    { 
     // do something to pass keys 
    } 

    foreach (int value in Args.Values) 
    { 
     // do something to pass values 
    } 
} 

Результат:

Variable: Args 
Count: 2 
Content: 
0x0000 {["value1", 1]} 
0x0001 {["value2", 2]} 

Однако, когда я изменил значение части к Dictionary<String, Object>, я нашел то же самое, как ваш проблема: Value часть изменена на System.String[] массив, который содержит число 1 или 2 в качестве строки.

Variable: Args 
Count: 2 
Content: 
0x0000 {["value1", System.String[]]} => Value: String[1] => 0x0000 = "1" 
0x0001 {["value2", System.String[]]} => Value: String[1] => 0x0000 = "2" 

Попытка изменить входной тип переменной в Dictionary<String, String> возвращается следующим образом:

Variable: Args 
Count: 2 
Content: 
0x0000 {["value1", "1"]} 
0x0001 {["value2", "2"]} 

Второй случай использует jQuery JSON plugin, который преобразует объект, данное editorsNames в JSON-отформатированную строку, а затем передается ответ в виде простого строка, которая распознается десериализатором на стороне контроллера. Такой подход соответствует как на стороне клиента объекты должны быть переданы:

  1. Пользовательский объект должен быть сериализовать в строку;
  2. Эта строка будет получена на стороне сервера, используя коллекцию Request.Params. Если вы десериализуете строку, вы получите , способный создать свой пользовательский объект на стороне сервера.

Таким образом, я пришел к выводу, что можно передать чистый объект JSON 2 способами:

  1. С помощью customArgs напрямую, вы можете объявить Dictionary в качестве входного параметра и прохождения значения, используя числовой тип значения или String. Избегайте использования типа Object, который, кажется, создает массив строки в качестве значения.

  2. Используя Request.Params, преобразуйте объект JSON в кодированную строку и передайте его в customArgs, затем используйте десериализацию, чтобы выявить ключ и значения.

Примечание: Вместо использования структуры содержит словарь в качестве одного входного параметра, можно написать несколько GridViewPartial методы перегрузки с различным количеством входных параметров для обработки сетки частичного вида.

Любые предложения или неудобства приветствуются.

Дополнительная ссылка:

How to pass complex objects to a callback Action as callback arguments

+0

Я не пытался вообще) После прочтения вашего ответа, я решил сделать , который позволит мне послать любые данные, которые я хочу и что на преобразовать его на сервере в нужные мне данные. Теперь я получаю свой json в словаре, где key = objname amd value = serialized string) – DespeiL

+0

Thx, для анализа вашей детали проблемы и предложений – DespeiL

Смежные вопросы