사전에 특성 라우팅이 작동하지 않음

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

문제

속성 라우팅에 익숙하지 않아이 기능을 사용하도록 도움을 요청하고 싶습니다.

이 테스트는 간단한 동적 DB 테이블 뷰어입니다. 테이블 이름 (또는 저장된 쿼리 이름 등)과 선택적으로 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 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 과 같은 것보다는 바닐라 데이터 구조.

수락 된 답변

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는 합법적입니까? 예, 이유를 알아보십시오.