Маршрутизация атрибутов не работает со словарями

Будучи новичком в маршрутизации атрибутов, я хотел бы попросить помощи, чтобы это заработало.

Этот тест представляет собой простое динамическое средство просмотра таблиц БД: учитывая имя таблицы (или сохраненное имя запроса или что-то еще) и, возможно, некоторые параметры WHERE, возвращайте результаты запроса.

Таблица COMPANIES (одна из любого количества таблиц, у которых где-то хранится связанный запрос SELECT с ключом по имени таблицы):

ID  NAME    HQ  INDUSTRY
1   Apple   USA Consumer electronics
2   Bose    USA Low-quality, expensive audio equipment
3   Nokia   FIN Mobile Phones

Контроллер:

[Route("view/{table}/{parameters}")]
public object Get(string table, Dictionary<string, string> parameters) {
    var sql = GetSql(table);
    var dbArgs = new DynamicParameters(parameters);
    return Database.Query(sql, dbArgs); // Return stuff/unrelated to problem
}

SQL хранится в каком-то ресурсе или таблице. Очевидно, что параметры должны точно совпадать:

SELECT * FROM companies
WHERE name = :name
-- OR hq = :hq
-- OR ...etc. Doesn't matter since it never gets this far.

Запрос (должен выглядеть чистым, но точный формат URL не важен):

www.website.com/view/companies?hq=fin --> 404: нет соответствующего контроллера www.website.com/view/companies/hq=fin --> parameters равно null www.website.com/view/companies/hq=fin&name=nokia --> Исключение: A potentially dangerous Request.Path value was detected from the client (&).

Когда я использую: [Route("view/{table}{parameters}")] я получаю:

A path segment cannot contain two consecutive parameters. They must be separated by a '/' or by a literal string. Parameter name: routeTemplate. Имеет смысл.

Мой вопрос: как мне принять имя таблицы и любое количество неизвестных параметров в обычной форме key1=val1&key2=val2 (не какой-то неудобный индексированный формат, подобный упомянутому здесь) который позже будет привязан к параметрам SQL, желательно с использованием ванильной структуры данных, а не чего-то вроде FormCollection.


person Charles Burns    schedule 30.12.2013    source источник


Ответы (1)


Я не думаю, что привязка параметров URL к словарю встроена в структуру. Я уверен, что есть способ расширить его, если вы хотите.

Я думаю, что самый быстрый (но все же приемлемый) вариант - получить параметры строки запроса с помощью Request.GetQueryNameValuePairs() следующим образом:

[Route("view/{table}")]
public object Get(string table) {
    Dictionary<string, string> parameters = Request.GetQueryNameValuePairs()
        .ToDictionary(x => x.Key, x => x.Value);
    var sql = GetSql(table);
    var dbArgs = new DynamicParameters(parameters);
    return Database.Query(sql, dbArgs); // Return stuff/unrelated to problem
}
person jebar8    schedule 31.12.2013