Rendering Component Instance in Razor Components / Blazor
source link: https://www.tuicool.com/articles/hit/QvyiMzV
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
In some child & parent component situations it would be good if you could render or at least get an access to an instance of a Razor Component.
Given the following scenario where we try to render an instance of the Counter-component inside the Index-component:
<h1>Hello, world!</h1> Welcome to your new app. @counterInstance @functions{ Counter counterInstance = new Counter(); }
The following doesn’t work as it only draws the type name of the component:
There are couple options around this.
Capturing reference
In many (if not most?) cases you should let Razor Components to take care of creating the instance of your component and then use the “ ref ” keyword to capture the rendered instance:
<h1>Hello, world!</h1> Welcome to your new app. @DrawCounter() @functions{ private Counter _myCounter = null; RenderFragment DrawCounter() { return new RenderFragment(builder => { builder.OpenComponent<Counter>(0); builder.AddComponentReferenceCapture(1, inst => { _myCounter = (Counter)inst; }); builder.CloseComponent(); }); }
Reflection
If you really want, you can access the RenderFragment of the instance using reflection and then draw that:
Welcome to your new app. @RenderContent(counterInstance) @functions{ Counter counterInstance = new Counter(); RenderFragment RenderContent(ComponentBase instance) { var fragmentField = GetPrivateField(instance.GetType(), "_renderFragment"); var value = (RenderFragment)fragmentField.GetValue(instance); return value; } //https://stackoverflow.com/a/48551735/66988 private static FieldInfo GetPrivateField(Type t, String name) { const BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly; FieldInfo fi; while ((fi = t.GetField(name, bf)) == null && (t = t.BaseType) != null) ; return fi; }
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK