Привязать строку QueryString с массивами с помощью MVC - PullRequest
5 голосов
/ 04 марта 2012

Я использую сетку пользовательского интерфейса Telerk Kendo, которая загружает данные удаленно.QueryString, переданный в мой метод действия, выглядит следующим образом: -

take=10&skip=0&page=1&pageSize=10&sort[0][field]=value&sort[0][dir]=asc

Я пытаюсь выяснить, как связать параметр sort с моим методом?Возможно ли это, или мне нужно перечислить через коллекцию QueryString вручную или создать пользовательское связующее?

До сих пор я пробовал это: -

public JsonResult GetAllContent(int page, int take, int pageSize, string[] sort)

public JsonResult GetAllContent(int page, int take, int pageSize, string sort)

, но сортировка всегда пуста,Кто-нибудь знает, как я могу добиться этого?

Я могу вернуться к использованию Request.QueryString, но это немного затруднительно.

var field = Request.QueryString["sort[0][field]"];
var dir = Request.QueryString["sort[0][dir]"];

Ответы [ 2 ]

7 голосов
/ 04 марта 2012

Вы можете использовать массив словарей:

public ActionResult Index(
    int page, int take, int pageSize, IDictionary<string, string>[] sort
)
{
    sort[0]["field"] will equal "value"
    sort[0]["dir"] will equal "asc"
    ...
}

, а затем определите пользовательский механизм связывания модели:

public class SortViewModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var modelName = bindingContext.ModelName;
        var keys = controllerContext
            .HttpContext
            .Request
            .Params
            .Keys
            .OfType<string>()
            .Where(key => key.StartsWith(modelName));

        var result = new Dictionary<string, string>();
        foreach (var key in keys)
        {
            var val = bindingContext.ValueProvider.GetValue(key);
            result[key.Replace(modelName, "").Replace("[", "").Replace("]", "")] = val.AttemptedValue;
        }

        return result;
    }
}

, который будет зарегистрирован в Global.asax:

ModelBinders.Binders.Add(typeof(IDictionary<string, string>), new SortViewModelBinder());
0 голосов
/ 22 июня 2018

Для ядра asp.net я не использовал связыватель модели, так как данные отправляются в виде словаря, я просто использовал следующую сигнатуру метода на моем API, и привязка произошла автоматически (сопоставление параметров не требуется на стороне клиента)

public async Task<JsonResult> GetAccessions(.., IDictionary<string, string>[] sort)
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...