Monthly Archives: Czerwiec 2014

FIM Portal – dopuszczalne wartości atrybutu i Constant Specifier

2014-06-05

W dzisiejszym wpisie przedstawię pewien problem związany z walidacją wartości atrybutów w portalu FIM. Załóżmy, że dany obiekt posiada atrybut tekstowy, w którym mogą znaleźć się jedynie wartości z określonego zbioru. Chcemy aby użytkownik podczas tworzenia obiektu miał do wyboru dwie wartości atrybutu: MyValue-1 oraz MyValue-2. Standardowo zaczynamy od ustawienia walidacji bindingu na odpowiednie wyrażenie regularne:

fim1

Następnie w widoku tworzenia obiektu definiujemy kontrolkę dla naszego atrybutu. Będzie to DropDownList z ItemSource ustawionym na właściwość LocalizedAllowedValues atrybutu:

<my:Control my:Name="MailboxType" my:TypeName="UocDropDownList"
	my:Caption="{Binding Source=schema, Path=MailboxType.DisplayName}"
	my:Description="{Binding Source=schema, Path=MailboxType.Description}"
	my:RightsLevel="{Binding Source=rights, Path=MailboxType}">
	<my:Properties>
		<my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=MailboxType.Required}" />
		<my:Property my:Name="ValuePath" my:Value="Value"/>
		<my:Property my:Name="CaptionPath" my:Value="Caption"/>
		<my:Property my:Name="HintPath" my:Value="Hint"/>
		<my:Property my:Name="ItemSource" my:Value="{Binding Source=schema, Path=MailboxType.LocalizedAllowedValues}"/>
		<my:Property my:Name="SelectedValue" my:Value="{Binding Source=object, Path=MailboxType, Mode=TwoWay}"/>
	</my:Properties>
</my:Control>

Teoretycznie wszystko zrobiliśmy poprawnie ale podczas tworzenia nowego obiektu okazuje się, że kontrolka DropDownList jest pusta. Oczekiwaliśmy, że będzie ona zwierała listę dopuszczalnych wartości dla interesującego nas atrybutu:

fim2

Przyczyną takiego zachowania jest użycie w wyrażeniu regularnym znaku „-„. Przy definiowaniu walidacji nie możemy używać znaków specjalnych takich jak  „-„, „.”, „?”, „$”, „|”, itp. No dobrze, ale co zrobić, jeżeli mimo wszystko chcemy aby w kontrolce wyświetlane były wartości z myślnikami? Rozwiązaniem jest użycie obiektów Constant Specifier. Wchodzimy do All Resources, wybieramy typ Constant Specifier i tworzymy nowe obiekty dla każdej z dopuszczalnych wartości. Podczas tworzenia obiektu Constant Specifier podajemy wartość jaka będzie wyświetlana w kontrolce, wartość klucza bez znaków specjalnych oraz wskazujemy atrybut i typ obiektu:

fim3

Teraz pozostało jedynie zmodyfikowanie wyrażenia regularnego w walidacji tak, aby zawierało wartości kluczy zamiast wartości wyświetlanych:

fim4

Po tej zmianie (i wykonaniu IISRESET) wszystko działa tak jak powinno, podczas tworzenia obiektu możemy wybrać jedną z dopuszczalnych wartości:

fim5

Powyżej pokazałem tylko jedno z zastosowań obiektów Constant Specifier. Generalnie pozwalają one na rozdzielenie dopuszczalnych wartości atrybutu na wartość fizycznie zapisywaną w obiekcie (Constant Value Key) oraz wartość wyświetlaną w UI (Display Name). Takie podejście jest dobrą praktyką z kilku powodów. Po pierwsze wartości atrybutów przechowywane w bazie danych mogą być niezrozumiałe dla użytkownika. Po drugie operowanie w kodzie na wartościach wyświetlanych powoduje konieczność jego modyfikacji przy każdej zmianie tych wartości. Ostatnią zaletą jest możliwość zdefiniowania wyświetlanych wartości dla różnych języków. Wystarczy podczas tworzenia obiektu Constant Specifier przejść na zakładkę Localization i dla poszczególnych języków (Supported Languages) podać wartość, jaka będzie wyświetlana w kontrolkach (Localized Display name).