2013-06-27 25 views
6

mi chiedevo se ci fosse un modo per chiamare in modo statico di una vista di rendering in modo simile a come si dovrebbe chiamare un sublayout utilizzando il seguente codice moduli web:statici Visualizza Rendering in Sitecore 6.6

<sc:Sublayout Path="~/sublayouts/samplesublayouts.ascx" DataSource="SomeItemId" runat="server" /> 

ho provato a fare questo:

@Html.Sitecore().ViewRendering("~/renderings/samplerendering.cshtml", new { DataSource= "SomeItemId"}) 

Ma io non posso fortemente digitare il rendering vista a meno che anche creare l'elemento di rendering in Sitecore e anche creare l'elemento modello Sitecore perché io riceverò ed errori. Mi piacerebbe sapere se c'è un modo altrettanto semplice che potrei usare con MVC per la tipizzazione statica di renderer interni.

risposta

12

L'approccio mostrato di seguito permette di vista rasoio di essere vincolato staticamente agli elementi di presentazione senza creare elementi di rendering.

Nel file layout.cshtml legano staticamente una vista rasoio che non hanno una vista rendering oggetto presentazione in Sitecore e specificare un DataSource oggetto:

@Html.Sitecore().ViewRendering("/views/StandaloneRendering.cshtml", new { DataSource = "/sitecore/content/Home/My Datasource Item" }) 

La vista StandaloneRendering.cshtml rasoio assomiglia a questo:

@using Sitecore.Mvc.Presentation 
@model RenderingModel 

@functions 
{ 
    public Sitecore.Data.Items.Item Item 
    { 
     get 
     { 
      var item = Sitecore.Context.Item; 

      if (!string.IsNullOrEmpty(Model.Rendering.DataSource)) 
      { 
       item = Sitecore.Context.Database.GetItem(Model.Rendering.DataSource); 
      } 
      return item; 
     } 
    } 
} 

<p>Item Name: @Model.PageItem.Name</p>  
<p>Datasource Path: @Model.Rendering.DataSource</p>  
<p>Datasource Item Name: @Item.Name</p> 
<p>Datasource Item Path: @Item.Paths.FullPath</p> 
<p>Datasource Item Template: @Item.TemplateName</p> 

Di seguito si stampa sulla pagina:

Item Name: Home 

Datasource Path: /sitecore/content/Home/My Datasource Item 

Datasource Item Name: My Datasource Item 

Datasource Item Path: /sitecore/content/Home/My Datasource Item 

Datasource Item Template: Sample Item 

Un paio di cose da tenere presente quando si fa questo:

  1. I campi Sitecore essere resi fuori dalla vista rasoio non sono modificabili nella pagina Editor.
  2. Dubito molto che l'uscita StandaloneRendering.cshtml farà nella cache Sitecore HTML.
  3. La struttura Item nel blocco @functions dovrebbe essere spostato per alcuni dove in modo che possa essere riutilizzato in più viste rasoio.
  4. Si tratta di un approccio non-standard. Ciò potrebbe confondere alcune persone che si aspettano di trovare un oggetto di rendering associato in Sitecore.
+1

Perché un lavoro di rendering standalone, dove come un rendering con una corrispondente voce non lo fa? Inoltre, non c'è modo di fornire un elemento Sitecore associato per il rendering che viene utilizzato, anche se non è modificabile nell'editor di pagine? –

+2

Credo che questo approccio funzioni anche se il file rasoio è anche configurato come rendering di una vista in Sitecore, cioè ha un elemento di rendering della vista il cui percorso punta ad esso. Dal tuo post originale avevo presupposto che tu fossi alla ricerca di un modo leggero per invocare staticamente le visualizzazioni del rasoio che potrebbero ricevere anche un parametro di origine dati. Può chiarire che cosa è che si sta cercando di fare e anche quale errore si stava vedendo, grazie –

+0

Questo sarebbe essenzialmente fare quello che stavo cercando, anche se ero alla ricerca di una costruito nel metodo di fare questo, dove l'elemento potrebbe essere gestito automaticamente da un modello che implementa IRenderingModel. Abbiamo finito per usare i modelli di glassmapper e costruendoli automaticamente usando la modifica integrata della pipeline di generazione del modello. Queste visualizzazioni non sono particolarmente particolari per il rendering di una vista, quindi siamo stati in grado di utilizzare PartialViews per raggiungere il nostro obiettivo. In questo modo potremmo semplicemente passare il modello stesso e il PartialView può solo fare il rendering del normale MVC. – IAreATomKs