Render ViewComponent da un altro componente codebehind
-
03-10-2019 - |
Domanda
Sto cercando di rendere un componente dalla withing un altro componente.
public override void Render()
// ...
var block = new Block();
block.Init(EngineContext, Context);
block.Render();
// ...
}
Il problema è che componente Block non riesce a trovarlo del modello.
ResourceProcessingException Messaggio: Impossibile risorsa processo 'componenti \ CustomReportComponentComponent \ default.vm': Risorsa non poteva essere situato
Credo, altri problemi possono sorgere in quanto il componente non è inizializzato correttamente.
E 'possibile inizializzare un componente all'interno di un altro componente Render metodo, in modo che rende proprio come se chiamato da un .vm?
Soluzione
Credo che hai bisogno di chiamare .init con un nuovo IViewComponentContext
.
component.Init(EngineContext, newViewComponentContext);
ora le implementazioni per IViewComponentContext
sono all'interno dei vari motori di vista. Il problema è -. Non ho familiarità con interni di NVelocity quindi non posso essere sicuro circa il modo di farlo con NV, avresti bisogno di un follow-up domanda
Una soluzione possibile: Si può avere un modello di vista condiviso, che chiama un componente, il cui nome è passato alla vista come parametro.
In AspView sarebbe simile a:
// in the calling component
PropertyBag["componentName"] = "theOtherComponent";
PropertyBag["componentParams"] = new Hashtable{{age,30},{name,"Ken"}};
var componentOutput = RenderViewInPlace("/shared/render_component");
// in render_component.aspx
<% InvokeViewComponent(Properties["componentName"], Properties["componentParams"], null, null); %>
Questo approccio dovrebbe funzionare in teoria, assumendo NV può ottenere un parametro per #blockcomponent (ancora una volta - è necessaria un'altra domanda di follow-up, sorry)