El enrutamiento de atributos no funciona con diccionarios

asp.net-web-api asp.net-web-api2 attributerouting dapper

Pregunta

Siendo nuevo en el enrutamiento de atributos, me gustaría pedir ayuda para que esto funcione.

Esta prueba es un simple visualizador dinámico de tablas DB: dado un nombre de tabla (o nombre de consulta almacenado o lo que sea) y opcionalmente algunos parámetros WHERE, devuelve los resultados de la consulta.

Table EMPRESAS (una de cualquier número de tablas que tenga una consulta SELECT asociada almacenada en alguna parte, codificada por el nombre de la tabla):

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

Controlador:

[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 almacenado en algún recurso o tabla. Obviamente, los parámetros deben coincidir exactamente:

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

Solicitud (debe verse limpio, pero el formato de URL exacto no es importante):

www.website.com/view/companies?hq=fin -> 404: No coincide el controlador www.website.com/view/companies/hq=fin -> parameters is null www.website.com/view/companies/hq=fin&name=nokia -> Excepción: A potentially dangerous Request.Path value was detected from the client (&).

Cuando uso: [Route("view/{table}{parameters}")] Obtengo:

A path segment cannot contain two consecutive parameters. They must be separated by a '/' or by a literal string. Parameter name: routeTemplate . Tiene sentido.

Mi pregunta es: ¿cómo acepto un nombre de tabla y cualquier cantidad de parámetros desconocidos en el formulario habitual key1=val1&key2=val2 ( no en algún formato indexado incómodo como el mencionado aquí ) que luego se enlazará a los parámetros SQL, preferiblemente usando un estructura de datos vainilla en lugar de algo así como FormCollection .

Respuesta aceptada

No creo que los parámetros obligatorios de URL para un diccionario estén incorporados en el marco. Estoy seguro de que hay una manera de ampliarlo si así lo deseas.

Creo que la opción más rápida (pero aún aceptable) es obtener los parámetros de cadena de consulta utilizando Request.GetQueryNameValuePairs() como este:

[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
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué