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


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

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

Табличные компании (одна из любого числа таблиц, которая имеет связанный запрос 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 равно нулю 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 form (не какой-то неудобный индексированный формат, подобный упомянутому здесь), который позже будет привязан к параметрам SQL, предпочтительно используя структуру данных vanilla, а не что-то вроде FormCollection.

1 2

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
}