"아무것도 하지 않는"Umbraco 패키지를 만든 이유
7678 단어 umbraco
이 문제를 고려하십시오. 페이지에 온도 속성이 있고 해당 속성은 선택 사항입니다. 코드에서 값 없음과 0°C를 어떻게 구분합니까?
기본적으로 Umbraco 백오피스의 빈 십진수 또는 정수 속성은 기본값property value converter의 다른 쪽에서 기본값 0으로 나옵니다. 이는 빈 값과 0을 구별할 수 있음을 의미합니다. 추가 업무.
내가 어떻게 하곤 했는지
![](https://s1.md5.ltd/image/f876ccfa303a6189c7ad36675340eb03.gif)
중첩된 콘텐츠. 기본적으로 작동하며 매우 의도적입니다. 중첩된 콘텐츠 내부의 속성은 필수여야 하며 편집기는 온도 값을 "추가"하거나 비워 둘 수 있습니다.
그러나 그것은 예쁘지 않고 편집자에게는 다소 투박한 흐름입니다.
백오피스는 이미 차이점을 알고 있습니다.
백오피스는 이미 소수/정수 속성에서 빈 값과 0을 구분합니다. 이 스크린샷에서 온도는 "0"이지만 온도 2는 비어 있습니다.
![](https://s1.md5.ltd/image/05c9eb156d79d30edbf4546ef4d75901.png)
따라서 우리에게 필요한 것은 코드에서 빈 값과 0 값을 구분하는 좋은 방법입니다.
그 값을 nullable로 만드십시오!
이것은 nullable 값이기 때문에 nullable 값 유형을 사용하기에 좋은 곳입니다! Umbraco는 이미 데이터베이스에 NULL로 저장합니다. 따라서
decimal
값 유형을 반환하는 십진수 속성 대신 decimal?
유형을 반환하도록 만들 수 있습니다.너 스스로해라
이렇게 하려면 null을 반환할 수 있는 새로운 속성 값 변환기를 사용해야 합니다.
상속(또는 데코레이터 패턴 사용)하여
ConvertSourceToIntermedia
클래스의 Umbraco.Cms.Core.PropertyEditors.ValueConverters
메서드를 대체하는 새 클래스를 만듭니다. nullable로 만드는 것은 실제로 매우 간단합니다.public object? ConvertSourceToIntermediate(
IPublishedElement owner,
IPublishedPropertyType propertyType,
object? source,
bool preview)
{
if (source is null)
{
return null;
}
// is it already a decimal?
if (source is decimal)
{
return source;
}
// is it a double?
if (source is double sourceDouble)
{
return Convert.ToDecimal(sourceDouble);
}
// is it a string?
if (source is string sourceString && decimal.TryParse(sourceString, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out decimal d))
{
return d;
}
// couldn't convert the source value - default to null
return null;
}
내 사이트는 Nullable Reference Types을 사용하므로 null을 반환하므로 반환 유형을
object
에서 object?
로 변경해야 합니다. 이것은 내가 단순히 상속할 수 없다는 것을 의미하므로 내 클래스는 실제로 데코레이터입니다.public class NullableDecimalConverter : IPropertyValueConverter
{
readonly IPropertyValueConverter coreConverter = new DecimalValueConverter();
...
클래스in my package's repo의 전체 예제를 볼 수 있습니다.
속성 값 변환기는 시작 시 유형 스캔되고 유형에 대해 한 번에 하나의 속성 값 변환기만 가질 수 있으므로 시작 시
DecimalValueConverter
를 NullableDecimalConverter
로 바꿔야 합니다.이를 위한 패키지가 있습니다
10진수 외에도 null 값을 반환할 수 있어야 하는 값 형식을 반환하는 다른 여러 속성 형식이 있습니다.
그래서 저는 Emptiness라는 패키지를 만들었습니다.
위에서 언급한 속성 유형에 대한 nullable 속성 값 변환기와 보너스를 추가합니다.
토글(참/거짓)
토글은 UI에서 null 상태가 아니지만 다음과 같은 경우 비어 있을 수 있습니다.
이러한 경우 다음 변환기가 유용할 수 있습니다.
YesNoDefaultConverter
속성 편집기의 설정에서 구성된 "초기 상태"(기본값) 값을 반환합니다. NullableYesNoConverter
, 콘텐츠가 속성과 함께 아직 (재)게시되지 않은 경우 null을 반환합니다. 시작하기
NuGet에서 설치하고 이동하십시오.
> dotnet add package Our.Umbraco.Emptiness
대부분의 사이트에 적합하다고 생각되는 default configuration이 있습니다. 비어있을 때 빈 정수, 소수점 및 날짜 선택기를 null로 만들고 Toggle이 기본값을 반환하도록 합니다.
설치 및 구성 후 ModelsBuilder 모델을 다시 빌드하면 관련 속성이 null 가능하게 된 것을 볼 수 있습니다(그래서 null 검사를 하는 것이 좋습니다 😉).
피드백 부탁드립니다🙏
패키지는 아직 새것이고 한 사이트에서만 화를 내며 사용하고 있으므로 어떤 것이든 정말 환영합니다feedback/issues etc..
Umbraco에서 속성으로 작업할 때 사용했던 것과는 다소 다르지만 null 허용 값이 백오피스 편집기 UI에서 발생하는 일을 가져와 웹사이트 코드에 표시하는 데 훨씬 더 좋은 방법이라는 것을 알았습니다.
Reference
이 문제에 관하여("아무것도 하지 않는"Umbraco 패키지를 만든 이유), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jasonelkin/why-i-built-an-umbraco-package-that-does-nothing-27n1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)