Le routage des attributs ne fonctionne pas avec les dictionnaires

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

Question

Étant nouveau dans l'attribution du routage, j'aimerais demander de l'aide pour que cela fonctionne.

Ce test est un visualiseur de table de base de données dynamique simple: avec un nom de table (ou un nom de requête stocké ou autre) et éventuellement des paramètres WHERE, retournez les résultats de la requête.

Table COMPANIES (une des nombreuses tables ayant une requête SELECT associée stockée quelque part, indexée par nom de table):

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

Manette:

[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 stocké dans une ressource ou une table. Evidemment les paramètres doivent correspondre exactement:

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

Request (Devrait être propre, mais le format exact de l'URL n'est pas important):

www.website.com/view/companies?hq=fin -> 404: aucun contrôleur correspondant www.website.com/view/companies/hq=fin -> parameters est nul www.website.com/view/companies/hq=fin&name=nokia -> Exception: A potentially dangerous Request.Path value was detected from the client (&).

Lorsque j'utilise: [Route("view/{table}{parameters}")] j'obtiens:

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

Ma question est la suivante: comment accepter un nom de table et un nombre quelconque de paramètres inconnus dans la forme habituelle key1=val1&key2=val2 ( pas un format indexé maladroit comme celui mentionné ici ) qui sera lié ultérieurement aux paramètres SQL structure de données vanilla plutôt que quelque chose comme FormCollection .

Réponse acceptée

Je ne pense pas que la liaison des paramètres d'URL à un dictionnaire soit intégrée au framework. Je suis sûr qu'il y a un moyen de l'étendre si vous le souhaitez.

Je pense que l'option la plus rapide (mais toujours acceptable) consiste à obtenir les paramètres de chaîne de requête à l'aide de Request.GetQueryNameValuePairs() comme ceci:

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


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi