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 oder OrmsWidgetParameter 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();
}