In diesem Beispiel wird das HelloWorldWidget
aus dem vorherigen Kapitel geändert, um ein Widget zu werden welches einen aktuellen Datensatz nutzt, um seinen Inhalt aufzubauen.
Steuerelement
Um Parameter nutzen zu können muss das Widget von DataItem<T>
erben. In diesem Fall wird das Widget ein OrmsWidgetParameter
nutzen. Statt Widget
zu erweitern, wird nun DataWidget<OrmsWidgetParameter>
erweitert.
public class HelloWorldWidget : DataWidget<OrmsWidgetParameter>
Das HelloWorldWidget
kann jetzt mit einer Parameterquelle konfiguriert werden:
- Keine: Wenn das Widget keine braucht,
- Seite: Wenn die Seite einen kompatiblen Parametertyp bereitstellt. Seiten können entweder
GridViewConfigWidgetParameter
oderOrmsWidgetParameter
bereitstellen, - Widget: Wenn die Quelle ein anderes in der Seite konfiguriertes Widgets sein soll. In dem Fall wird ein zusätzliche Auswahl angezeigt, in der man ein kompatibles Widget selektieren kann.
Controller
Der HelloWorldWidgetController
erweitert nun DataWidgetControllerBase
. Damit hat der Controller den Parameter im JSON Format in der Eigenschaft ParameterJsonString
und kann ihn de-serialisieren. Wenn der Controller ein Parameter erhält, wird das HelloWorldWidget
nun einen anderen Text anzeigen.
public class HelloWorldWidgetController : DataWidgetControllerBase
{
public ActionResult Index(string textLanguage)
{
HelloWorldWidgetViewModel viewModel = new HelloWorldWidgetViewModel();
if (string.IsNullOrWhiteSpace(textLanguage))
viewModel.ErrorText = "No language configured";
else
switch (textLanguage.ToUpper())
{
case "DE":
viewModel.SalutationText = "Hallo";
viewModel.ToSalutate = "Welt";
break;
default:
viewModel.SalutationText = "Hello";
viewModel.ToSalutate = "world";
break;
}
string jsonParameter = ParameterJsonString;
if (!string.IsNullOrWhiteSpace(jsonParameter))
{
OrmsWidgetParameter parameter = JsonConvert.DeserializeObject<OrmsWidgetParameter>(jsonParameter);
if (parameter != null && parameter.Orms != null && parameter.Orms.Any())
{
OrmData ormData = parameter.Orms.First();
OrmBABase orm = API.Api.ORM.GetOrm(ormData.OrmTypeGuid, ormData.OrmGuid);
viewModel.ToSalutate = orm.EntityTitle;
}
}
return PartialView(viewModel);
}
}
!https://manula.r.sizr.io/large/user/7448/img/widget-5_v1.png!
Anmerkungen
Wenn das DataWidget den OrmTyp wissen soll
Dann muss es folgende Methode überschreiben:
public override Type GetWidgetWantedInterface()
{
return typeof(IProvideOrmsWidgetParameter<>);
}
Damit werden nur Widgets als ParameterQuelle angezeigt, welche das Interface implementieren und der Typ damit bekannt ist. Dann kann das Widget den Typ so lesen:
private Guid? GetOrmTypeGuid()
{
string ormDataSource = null;
if (WidgetParameterSource == EnumWidgetParameterSource.Page)
ormDataSource = (Configuration as PageConfiguration).OrmDataSource;
if (WidgetParameterSource == EnumWidgetParameterSource.OtherWidget
&& !string.IsNullOrWhiteSpace(this.SourceWidget)
&& Configuration is PageConfiguration page)
{
ControlBase provider = page.GetControl(this.SourceWidget.ToGuid());
if (provider != null
&& provider is IProvideOrmsWidgetParameter owpProvider)
ormDataSource = owpProvider.GetOrmDataSource();
}
if (!string.IsNullOrWhiteSpace(ormDataSource))
return Api.ORM.GetOrmTypeCacheValue(ormDataSource)?.Guid;
return null;
}
Wenn das Widget nicht ohne Parameter gerendert sein kann
Dann muss das Widget die folgende Funktion so überschreiben:
public override Guid[] WidgetParameterSourceFilter(string propertyName)
{
List<Guid> ret = new List<Guid>();
if (CanUseWidgetParameterFromPage)
ret.Add(EnumWidgetParameterSource.Page);
ret.Add(EnumWidgetParameterSource.OtherWidget);
return ret.ToArray();
}