Маршрутизация атрибутов не работает со словарями
Будучи новичком в атрибутивной маршрутизации, я хотел бы попросить вас помочь в этом.
Этот тест представляет собой простой динамический просмотрщик таблиц БД: задается имя таблицы (или сохраненное имя запроса или что-то еще) и необязательно некоторые параметры 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 ответ:
Я не думаю, что привязка параметров 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 }