属性ルーティングが辞書で機能しない

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

質問

属性ルーティングを初めて使用しているので、これを機能させるための助けを求めることができます。

このテストは、単純な動的DBテーブルビューアです。テーブル名(またはストアドクエリ名など)とオプションでWHEREパラメータを指定すると、クエリ結果を返します。

テーブルCOMPANIES(関連付けられたSELECTクエリがどこかに格納され、テーブル名でキー付けされている任意の数のテーブルの1つ):

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 is 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ようなものではなく、バニラのデータ構造FormCollection

受け入れられた回答

Dictionaryへの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
}


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ