카테고리 없음
[.그물] 선택적 매개 변수 : "비어 있음"대 "제공되지 않음"
행복을전해요
2021. 1. 27. 05:05
실제로이를 수행하는 방법에는 여러 가지가 있습니다.
- @Badri가 제안했듯이
Request
작업에서 직접 개체를 사용할 수 있습니다 . 이것은 매우 간단하고 간단한 접근 방식이지만 컨트롤러 로직을 포맷팅 / 바인딩 로직과 혼합합니다. 우려 사항을 더 잘 분리하려면 다음 중 하나를 시도하십시오. - 선택할 수 있는 여러 매개 변수 바인딩 메커니즘 이 있습니다. 이 경우 사용자 정의 모델 바인더가 잘 작동 할 수있는 것 같습니다.
Request
모델 바인더 의 개체에 액세스하고 @Badri의 코드와 유사한 것을 사용 하여 작업에 전달되기 전에 예상되는 값 (String.Empty
또는null
) 을 설정할 수 있습니다. - 생년월일 필드에 대한 값 공급자가 더 나은 옵션 일 수 있습니다. 궁극적으로 DateTime 객체로 변환 할 수있는 문자열을 전달합니다. 해당 매개 변수가 사용자 지정 값 공급자 (예 :)를 사용하도록 지정
IntuitiveDateTimeValueProvider
하면 실제로 작업의 매개 변수 유형을DateTime
또는Nullable<DateTime>
(DateTime?
)로 변경하고 값 공급자가 값을 적절하게 채우도록 할 수 있습니다. 비어있는 것과 널 (예 :)을 구별하려는 더 간단한 문자열에 대해서도 유사한 전략을 사용할 수 있습니다ExistenceTestingStringValueProvider
. - 추가 경로 / 작업을 만듭니다. 가능한 조합이 너무 많기 때문에 매개 변수가 많으면 좋은 옵션이 아니지만, 조합이 적 으면 매우 간단한 솔루션입니다. 이를 수행하는 한 가지 방법은 각 조합에 대해 단순히 메서드 오버로드를 만드는 것입니다. 가있는 오버로드 만
name
적중 된birthdate
경우 지정되지 않았 음을 의미 하지만 두 매개 변수가있는 오버로드가 적중 된birthdate
경우 값이null
인 경우에도 지정 되었음을 의미하므로 지정되었지만 비어있는 매개 변수 값을 구분할 수있는 방법을 제공합니다. 및 지정되지 않은 매개 변수 값.
ASP.NET Web API 바인딩을 사용하면 불가능합니다. DTO 클래스가 있고이를 이와 같은 바인딩에 사용합니다.
public class MyDto
{
public string Name { get; set; }
public string BirthDate { get; set; }
}
public void Update([FromUri]MyDto dto) { }
생략 BirthDate
하거나 빈 값이있는 쿼리 문자열에 포함하면 기본적으로 동일하며 BirthDate
두 경우 모두 속성은 null이됩니다. 그러나 이와 같이 쿼리 문자열을 직접 읽을 수 있습니다.
string qs = Request.RequestUri.Query.Substring(1); // leave out ?
var pairs = System.Web.HttpUtility.ParseQueryString(qs);
이 경우 pairs["BirthDate"]
쿼리 문자열 (? name = Sherlock)에서 필드를 생략하면 null이됩니다.
빈 값 (? birthdate = & name = Sherlock)이있는 쿼리 문자열에 포함 된 pairs["BirthDate"]
경우 빈 문자열 ( "")이됩니다.
출처
https://stackoverflow.com/questions/22029812