2012-03-26 9 views
3

Ich arbeite derzeit an einer Website, die die Datei document.cshtml überschreiben muss, damit ich eine bestimmte CSS-Klasse basierend auf dem aktuellen Standort des Benutzers anwenden kann.Verwenden von Alternativen für Document.cshtml in Orchard CMS

Ich habe versucht, URL Alternativen zu verwenden, wie zum Beispiel:

  • Document.cshtml
  • Document-url-AreaA.cshtml
  • Document-url-AreaB.cshtml
  • Dokument.url-AreaC.shtml

es scheint jedoch, dass alle von ihnen die Document.cshtml im Gegensatz zu einer basierend auf der URL verwenden. Ich könnte leicht verstehen, dass dies der beabsichtigte Zweck ist, aber ich frage mich, ob es möglich wäre, die obige Funktionalität zu implementieren.


aktualisiert

Ich glaube, dass ich in diesem Bereich einige Fortschritte gemacht haben kann, im Gegensatz zu URL Alternativen verwenden und einfach ein Feld auf dem Modell hinzugefügt (für das Dokument), einfach die aktuellen zu ziehen "Area" der Site und wenden Sie diese Klasse auf den Körper an.

(Innerhalb document.cshtml)

@using Orchard.Mvc.Html; 
@using Orchard.UI.Resources; 
@{ 
    RegisterLink(new LinkEntry {Type = "image/x-icon", ...}); 

    string title = Convert.ToString(Model.Title); 
    string siteName = Convert.ToString(WorkContext.CurrentSite.SiteName); 

    //Pull the Area here 
    string area = Model.DesignatedAreaField; 
} 
<!DOCTYPE html> 
<html lang="en" class="static @Html.ClassForPage()"> 
<head> 
    <meta charset="utf-8" /> 
    <title>@Html.Title(title, siteName)</title> 
    @Display(Model.Head) 
</head> 
<body class='@area'> 
//Body goes here 
@Display(Model.Body) 
@Display(Model.Tail) 
</body> 
</html> 

Ich glaube, dass dies eine einfachere Lösung als die zuvor vorgeschlagen. Ich frage mich jedoch, was die einfachste Methode ist, ein Feld zu platzieren, auf das ich vom Modell des Dokuments aus zugreifen könnte.

Antwort

7

Document.cshtml ist ein Wrapper für die Layoutform. Wrapper unterstützen keine Alternativen. Die einzige Möglichkeit, die Vorlage "document.cshtml" selektiv zu ersetzen, besteht darin, den vorhandenen Wrapper aus der Wrappers-Sammlung in den Metadaten der Layoutform zu entfernen und eigene hinzuzufügen.

Aber warte ... Ich kann mir keinen guten Grund vorstellen, warum du das machen willst. Was in document.cshtml ist, ist HTML-Code, der auf der gesamten Site gleich sein sollte. Die in Ihrem Update beschriebene Lösung ist der richtige Weg.

+0

Danke Bertrand. Ich habe mehrere Versuche unternommen, den oben genannten "Bereich" zu setzen, aber ich konnte ihn nicht zur Arbeit bringen. Gibt es etwas, das ich vermissen könnte? Ich habe der Seite ein Inhaltsfeld hinzugefügt und versucht, es als Layout.FeldName festzulegen, und habe versucht, darauf zuzugreifen, indem ich string = Layout verwendete.Feldname, konnte jedoch nicht darauf zugreifen. Irgendwelche Vorschläge? –

+0

Richtig, '@ Bereich' wird es nicht schneiden. '@ Model.FieldName' würde funktionieren, wenn Sie' Layout.FieldName = "something" 'von woanders setzen. –

0

Vielleicht möchten Sie sich diesen Beitrag ansehen: http://weblogs.asp.net/bleroy/archive/2010/12/14/switching-the-layout-in-orchard-cms.aspx. Es wird gezeigt, wie Sie Ihre eigenen Alternativen dynamisch hinzufügen können. Derselbe Ansatz könnte jedoch auch zum Hinzufügen von Eigenschaften zum Modell oder Layout basierend auf Geolocation führen.

Ich denke, Sie können Code in OnResultExecuting() definieren, um eine Eigenschaft dynamisch zur Model-Klasse hinzuzufügen. Da es vom Typ dynamisch ist, sollten Sie es nur einstellen können, nichts besonderes benötigt.

1

Sie könnten auch das <body>-Tag in Layout.cshtml verschieben und dann URL-Alternativen von Layout.cshtml verwenden, um das Klassenattribut <body>'s festzulegen.

Verwandte Themen