2010-12-29 10 views
3

Ich brauche einen Ratschlag.
(Für diejenigen, die dies bereits gelesen haben, habe ich diese Frage stark überarbeitet)asp.net mvc stand alone ascx control wie verbinde ich (css und js) am effizientesten

Ich habe einige asp.net mvc Webseiten entwickelt.
Jede Seite hat einen Master und einige Ascx-Steuerelemente (zwischen 2 - 6) darin eingebettet eine js und CSS-Datei.
Bis jetzt war alles in Ordnung.

Um Modularität, Flexibilität und Testbarkeit zu verbessern, wird von den ascx jetzt erwartet, dass sie als eigenständige Steuerungen arbeiten können.
(Jede Ascx hat auch ihre eigenen CSS- und JS-Dateien in einigen Fällen hat es ein anderes Steuerelement)

Um diese Anforderung zu erfüllen, rufen wir den Controller mit einer Abfragezeichenfolge.
(Unterscheidet sich von der Art und Weise, dass sie von der Seite aufgerufen wird - über Ajax)

Das gerenderte ascx (teilweise) präsentiert im Browser, ohne alle anderen Teile der Originalseite.

In diesem Fall müssen alle relevanten Dateien (z. B. jquery) zum Benutzersteuerelement hinzugefügt werden, damit das partielle korrekt angezeigt (css) und korrekt ausgeführt wird (js/jquery).
Dies widerspricht dem Konzept der Positionierung der Dateien am logischsten Ort (könnte zum Beispiel die Masterseite sein).

Wie kann ich dieses Problem lösen? Beachten Sie, dass dies für jede "control" ascx-Datei relevant ist, die in der Anwendung erstellt wird.


Beispiele:
Ich habe eine Beschreibung von drei Fällen hinzugefügt, dass mein Szenario darstellen wird:
(diese von einer anderen Frage, die ich here fragte kopiert wurde).

Fall 1: In der Seite Fall könnte es sein, dass eine Seite ein paar Partials hat, die mit Ajax geladen werden, während die Seite erstellt wird. Die Teiltöne können erneut mit Hilfe von AJAX gemäß den Benutzeraktionen aufgerufen werden. In diesem Fall betrachte ich sie als Steuerelemente auf einer Seite.

Fall 2: Im Stand-Alone-Fall könnte das Teil im Rahmen eines Tests direkt vom Browser aufgerufen werden. In diesem Fall sehen Sie nur den Teil im Browser.

Fall 3: Im dritten Fall könnte der Teil als Teil eines iframe innerhalb einer Google Chrome-Erweiterung (zum Beispiel) aufgerufen werden. In diesem Fall können Sie die Teilansicht auf einer Seite sehen, die möglicherweise nicht in Ihrer Webanwendung erstellt wurde.


Alle Gedanken werden geschätzt.

Für diejenigen, die feiern - Frohes neues Jahr!

+0

julian, würde ich ‚Senden‘, dass die CSS für das reibungslose Funktionieren der Steuer irrelevant ist. Warum?? weil das css direkt mit dem gesamten Look and Feel der fraglichen Zielseite verbunden ist. Daher sollte meiner Meinung nach das CSS (sofern es sich nicht um jquery-Selektoren handelt) auf einer höheren Ebene abstrahiert und daher vollständig von den fraglichen ascx-Kontrollen isoliert werden. Ich mag mich irren, aber das fühlt sich für mich "richtiger" an - d. h. css wird von der Site gesteuert und nicht von der Funktionalität der Kontrolle (außer wo die CSS jquery-getriebene Klassen- oder ID-Selektoren sind). –

+0

lief die Zeichen aus, um abzuschließen :). Die Verwendung der oben genannten Disziplin bedeutet, dass sowohl Admin- als auch Public-Face-Kontrollen geteilt werden können, auch wenn das Styling auf beiden Seiten in Konflikt steht. –

+0

@jim - einige unserer Steuerelemente enthalten in ihnen versteckte Elemente (mit CSS) Wenn das CSS auf Site-Ebene ist, werden die versteckten Felder auf dem Steuerelement angezeigt, wenn es alleine gerendert wird. Außerdem kann der Benutzer das Aussehen und Verhalten dieses Steuerelements nicht überprüfen, wenn kein CSS vorhanden ist. –

Antwort

0

Ich füge meine eigene Antwort hinzu, es könnte sein, dass meine Frage nicht klar genug war. Auf jeden Fall, wenn jemand eine Lösung braucht das ist, wo ich im Moment bin:


Dies ist der untere Abschnitt des Teil (Control)

<%-- 
///----------------------------------------------------------------------- 
/// <summary> 
///  <title>Java Scripts Section</title> 
///  Contains all links to java script files that are used by this 
///  partial. 
/// 
///  If the partial is part of a viewpage, only the partial's scripts 
///  should be downloaded. (It was called using Ajax) 
/// 
///  In the case that the partial acts as a stand alone control it needs 
///  to fetch other scripts that are preloaded by the application. 
///  (For example jQuery) 
/// 
///  This is achived by identifying that the partial was not called 
///  via Ajax in this case the list of Java Script files that have 
///  been included is added to the HTML that then fetches them from 
///  the server. 
///  <ToDo> 
///   A. Need to join and minify scripts to improve performance. 
///   B. Consider identifing the Ajax call in the controller: 
///   request.IsAjaxRequest(). 
///  </ToDo> 
/// </summary> 
///----------------------------------------------------------------------- 
--%> 
<% 
    string areaRoot = "~/Areas/Manufactor/"; 
    string areaJsRoot = areaRoot + "JQuery/"; 

    string dataLayer = areaJsRoot + "manufactorAjax.js"; 
    string javaScript = areaJsRoot + "vucManufactorDetails.js";  
%> 
<% if (HttpContext.Current.Request.Headers.Get("X-Requested-With") != "XMLHttpRequest") { %> 
<!-- #Include virtual="~/Include/GenericScripts.inc" --> 

<script type="text/javascript" src="<%= ResolveUrl(dataLayer)%>"> 
</script> 
<% }; %> 

<script type="text/javascript" src="<%= ResolveUrl(javaScript)%>"> 
</script> 
<%-- 
///----------------------------------------------------------------------- 
/// <end> 
///  This ends the ManufactorDetails.ascx file. 
/// </end> 
///----------------------------------------------------------------------- 
--%> 

Dies ist der Inhalt von die Include-Datei:

<%-- 
///----------------------------------------------------------------------- 
/// <summary> 
///  <link>System generic Scripts</link> 
///  The system generic scripts used to manage controls in the system. 
/// </summary> 
///----------------------------------------------------------------------- 
--%> 

<% 
    string jsRoot = "~/Scripts/"; 

    string jqueryLink = jsRoot + "jquery-1.4.1.min.js"; 
    string jqueryUI = jsRoot + "jquery-ui-1.8.4.custom.min.js"; 
    string jqueryCorner = jsRoot + "jquery.corner.js"; 
    string microsoftAjax = jsRoot + "microsoftAjax.js"; 
    string microsoftMvcAjax = jsRoot + "microsoftMvcAjax.js"; 
    string dataProvider = jsRoot + "dataProvider.js"; 
%> 

<script type="text/javascript" src="<%= ResolveUrl(jqueryLink)%>"> 
</script> 

<script type="text/javascript" src="<%= ResolveUrl(jqueryUI)%>"> 
</script> 

<script type="text/javascript" src="<%= ResolveUrl(jqueryCorner)%>"> 
</script> 

<script type="text/javascript" src="<%= ResolveUrl(microsoftAjax)%>"> 
</script> 

<script type="text/javascript" src="<%= ResolveUrl(microsoftMvcAjax)%>"> 
</script> 

<script type="text/javascript" src="<%= ResolveUrl(dataProvider)%>"> 
</script> 

<%-- 
///----------------------------------------------------------------------- 
///  End of GenericScript.inc 
///----------------------------------------------------------------------- 
--%> 

Ich habe ähnliche Logik für CSS-Dateien an der Spitze der Teil angewendet.

Hinweis:
Die Include-Datei wird immer geladen. Im Falle der partiellen - das ist ein Teil der Web-Anwendung wird nicht verarbeitet.

Seien Sie glücklich und das Leben genießen, Julian

2

Wenn Sie der Hostseite Inhalt hinzufügen müssen, können Sie Code in Ihrer ASCX-Datei verwenden, um diese Server-Seite auszuführen.Zum Beispiel:

<% 
    var link = new HtmlLink { Href = Url.Content("~/Content/Style/MySheet.css") }; 
    link.Attributes["rel"] = "Stylesheet"; 
    link.Attributes["type"] = "text/css"; 
    Page.Header.Controls.Add(link); 
%> 

Für dieses Beispiel funktioniert, müssen Sie eine runat="server" für Ihren head Tag haben.

+0

danke, ich habe etwa 15 Dateien zu integrieren, um die Steuerung zum Arbeiten allein zu erhalten. (jquery, microsoft, theme datei etc ..) Gibt es eine Möglichkeit zu unterscheiden, ob das Steuerelement Teil einer Webseite ist oder alleine ausgeführt wird und in diesem Fall den Code für die relevanten (15) Dateien enthält? –

+0

Da Ihr Controller die Logik des Renderns nur des Partiellen verarbeitet, könnte er Daten an das Ansichtsmodell des Partials übergeben, um ihn darüber zu informieren, ob es als ganze Seite und nicht nur als ein Stück dargestellt werden soll. – Jacob

+0

Ich glaube nicht, dass der Controller den "Modus" kennen sollte, von dem er aufgerufen wird. –