2014-01-08 4 views
3

Я должен передать массив фильтров, как это:как получить доступ к Javascript многомерный массив в контроллере MVC

Script Код:

return { CustomFilter: options.filter.filters }; 

++++++++++++++ ++++++++++++++++++++++++++++++++++

От Firebug:

CustomFilter[0][field]  ItemName 
CustomFilter[0][operator] startswith 
CustomFilter[0][value]  testing Value 

CustomFilter[1][field]  BrandName 
CustomFilter[1][operator] startswith 
CustomFilter[1][value]  testing Value 1 

Опубликовано значения : enter image description here

Но я не могу получить их на стороне контроллера.

я попытался так:

public ActionResult ReadOperation(string[][] CustomFilter) 

Кроме того, как это:

public ActionResult ReadOperation(Filter[] CustomFilter) 
public class Filter 
{ 
    public string field { get; set; } 
    public string @operator { get; set; } 
    public string value { get; set; } 
} 

Но не получилось. Пожалуйста, предложите.

Tried with model approach

Спасибо.


Решение найдено с Json десериализации

код сценария изменен:

return { CustomFilter: JSON.stringify(CustomFilter) }; 

контроллер код изменен:

using Newtonsoft.Json; 

public ActionResult ReadOperation(MyViewModel model) 
{ 
    var filters = JsonConvert.DeserializeObject(model.CustomFilter, typeof(CustomFilter[])); 
} 

public class MyViewModel 
{ 
    public string Filter { get; set; } 
    public string group { get; set; } 
    public int page { get; set; } 
    public int pageSize { get; set; } 
    public int sort { get; set; } 
} 


public class CustomFilter 
{ 
    public string field { get; set; } 
    public string @operator { get; set; } 
    public string value { get; set; } 
} 

Результат Показать в контроллере:

enter image description here

+0

Содержит ли ваш код вообще? –

+0

Да, он также показывает счет 2, поскольку я пропускаю 2 фильтра, но значения поля, оператора и значения показывают нуль. – Gerry

+0

Можете ли вы опубликовать необработанный JSON? Firebug должен показать, что отправлено. –

ответ

1

Если вы используете ASP.NET MVC 4, и не может изменить имена параметров, может быть, вы можете определить пользовательские модели следующим образом:

public class MyViewModel 
{ 
    public Dictionary<string,string>[] CustomerFilter { get; set; } 
    public string filter { get; set; } 
    public string group { get; set; } 
    public int page { get; set; } 
    public int pageSize { get; set; } 
    public int sort { get; set; } 
} 

Затем на контроллере:

public ActionResult ReadOperation(MyViewModel model){ ... } 

кажется, тыс при нотации, используемой в параметрах, генерируемых вашей сеткой, составляет dictionaries. Однако, не пробовал набор словарей.

+1

Спасибо за ваше предложение. Хотя я уже делал это с серией Json De. Но я тоже пробовал свой путь, и это сработало для меня. Спасибо :) – Gerry

+0

Добро пожаловать :) –

2

Похоже, что ошибка связана с моделью.

public class MyViewModel 
{ 
    public Filter[] CustomFilter { get; set; } 
    public string Filter { get; set; } 
    public string Group { get; set; } 
    public int Page { get; set; } 
    public int PageSize { get; set; } 
    public int Sort { get; set; } 
} 

Попробуйте использовать этот тип для привязки к модели.

public ActionResult ReadOperation(MyViewModel model) 
+0

Спасибо @Ufuk .i попробовали, как вы сказали, но все же он показывает CustomFilter как null. – Gerry

+0

@Gerry Я сделал ошибку в именах свойств. Можете ли вы повторить попытку? –

+0

Да @ Ufuk я заметил, что я уже пробовал с правильным именем свойства «CustomFilter». Снова значения свойств были пустыми. я добавил скриншот из контроллера внизу вопроса, вы можете это проверить. – Gerry

1

В пост, попробуйте отправить данные, как это:

CustomFilter[0].Field  ItemName 
CustomFilter[0].Operator startswith 
CustomFilter[0].Value  testing Value 

CustomFilter[1].Field  BrandName 
CustomFilter[1].Operator startswith 
CustomFilter[1].Value  testing Value 1 

И на контроллере:

public ActionResult ReadOperation(Filter[] CustomFilter) 

Имея Filter класс, определяемый как:

public class Filter 
{ 
    public string Field { set; get; } 
    public string Operator { set; get; } 
    public string Value { set; get; } 
} 

(Будьте осторожны с капи буквы).

Или, если вы хотите использовать модельный подход, как предполагает Ufuk, и имеющие тот же Filter класс:

  • Модель:

    public class MyViewModel 
    { 
        public Filter[] CustomerFilter { get; set; } 
        public string Filter { get; set; } 
        public string Group { get; set; } 
        public int Page { get; set; } 
        public int PageSize { get; set; } 
        public int Sort { get; set; } 
    } 
    
  • параметры в POST:

    CustomFilter[0].Field  ItemName 
    CustomFilter[0].Operator startswith 
    CustomFilter[0].Value  testing Value 
    
    CustomFilter[1].Field  BrandName 
    CustomFilter[1].Operator startswith 
    CustomFilter[1].Value  testing Value 1 
    
    Filter      ItemName~startswith~'12'~and~BrandName~startswith~'123' 
    Group 
    Page      1 
    PageSize     15 
    Sort 
    
  • Контролер

    public ActionResult ReadOperation(MyViewModel model) 
    

Смотрите эту ссылку: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

+0

Спасибо @Guillermo, Но я могу передавать значения контроллеру, как вы сказали, потому что они отправляются самой сетью kendo. Другой мудрый я должен изменить запрос фильтра с помощью скрипта (не хочу этого делать). – Gerry

+0

Я вижу, так что это формат по умолчанию параметров Kendo Grid. Единственным способом было бы сделать заказное связующее устройство. –

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