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