다음 WebAPI 메소드를 구현해야합니다.
/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX
모든 쿼리 문자열 매개 변수는 null 일 수 있습니다. 즉, 호출자는 0에서 5 개의 매개 변수를 모두 지정할 수 있습니다.
MVC4 베타 에서는 다음을 수행했습니다.
public class BooksController : ApiController
{
// GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
public string GetFindBooks(string author, string title, string isbn, string somethingelse, DateTime? date)
{
// ...
}
}
MVC4 RC는 더 이상이 동작을하지 않습니다. 5 개 미만의 매개 변수를 지정하면 다음과 같이 응답합니다 404
.
컨트롤러 ‘도서’에서 요청과 일치하는 조치가 없습니다.
URL 라우팅에서 선택적 매개 변수를 지정하지 않고 이전과 같이 동작하도록하는 올바른 메소드 서명은 무엇입니까?
답변
이 문제는 MVC4 정식 릴리스에서 수정되었습니다. 이제 할 수있는 일 :
public string GetFindBooks(string author="", string title="", string isbn="", string somethingelse="", DateTime? date= null)
{
// ...
}
모든 것이 즉시 작동합니다.
답변
vijay가 제안한대로 여러 매개 변수를 단일 모델로 전달할 수 있습니다. FromUri 매개 변수 속성을 사용할 때 GET에 적용됩니다. 이것은 WebAPI에게 쿼리 매개 변수에서 모델을 채우도록 지시합니다.
그 결과 단 하나의 매개 변수만으로보다 깔끔한 컨트롤러 작업이 가능합니다. 자세한 내용은 다음을 참조 하십시오 : http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
public class BooksController : ApiController
{
// GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
public string GetFindBooks([FromUri]BookQuery query)
{
// ...
}
}
public class BookQuery
{
public string Author { get; set; }
public string Title { get; set; }
public string ISBN { get; set; }
public string SomethingElse { get; set; }
public DateTime? Date { get; set; }
}
속성이 충돌하지 않는 한 여러 매개 변수도 지원합니다.
// GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
public string GetFindBooks([FromUri]BookQuery query, [FromUri]Paging paging)
{
// ...
}
public class Paging
{
public string Sort { get; set; }
public int Skip { get; set; }
public int Take { get; set; }
}
업데이트 :
값을 선택적으로 사용하려면 모델 속성에 참조 유형 또는 nullable (예 : int?)을 사용해야합니다.
답변
아래와 같은 모든 매개 변수에 초기 기본값 사용
public string GetFindBooks(string author="", string title="", string isbn="", string somethingelse="", DateTime? date= null)
{
// ...
}
답변
여러 매개 변수를 전달하려는 경우 여러 매개 변수를 전달하는 대신 모델을 만들 수 있습니다.
매개 변수를 전달하지 않으려는 경우 건너 뛸 수 있으며 코드가 깔끔하고 깔끔하게 보입니다.
답변
‘ optional
‘로 선언되지 않은 매개 변수에는 기본값을 제공 할 수 없습니다
Function GetFindBooks(id As Integer, ByVal pid As Integer, Optional sort As String = "DESC", Optional limit As Integer = 99)
당신의 WebApiConfig
config.Routes.MapHttpRoute( _
name:="books", _
routeTemplate:="api/{controller}/{action}/{id}/{pid}/{sort}/{limit}", _
defaults:=New With {.id = RouteParameter.Optional, .pid = RouteParameter.Optional, .sort = UrlParameter.Optional, .limit = UrlParameter.Optional} _
)