2012-04-23 19 views
15

का उपयोग कर गतिशील स्टाइलशीट्स मैं सीएसएस फ़ाइलों में रेजर का उपयोग कैसे कर सकता हूं?रेजर

मैं कुछ समय के लिए Razor View Engine का उपयोग कर रहा हूं और मैं स्टाइल शीट पर इसका उपयोग करने के बारे में उत्सुक था। मैं .cshtml फ़ाइलों के <style> ब्लॉकों में उस्तरा उपयोग कर सकते हैं लेकिन अगर मैं बाहरी .css फाइलों में इसका इस्तेमाल भी (एक .cscss प्रारूप करना चाहते हैं) कर सकते हैं मैं सोच रहा था। तो मैंने इसे गुमराह किया और दो चीजें पाई:

पहला वाला LESS है: "गतिशील स्टाइलशीट भाषा"। यह सभी सुविधाओं के साथ उपयोग में आसान और शक्तिशाली लगता है लेकिन मुझे वास्तव में रेजर-सी # की आवश्यकता है।

दूसरा Dynamic CSS Using Razor Engine है, एक कोडप्रोजेक्ट आलेख जो मुझे चाहिए, उतना ही है, लेकिन इसमें कोई कैशिंग या पूर्व-संकलन समर्थन नहीं है ("कोई समर्थन नहीं" मेरा मतलब है कि लेखक ने इन पहलुओं का उल्लेख नहीं किया है)। मैं विजुअल स्टूडियो में कुछ सिंटैक्स हाइलाइट करना चाहता हूं लेकिन यह माध्यमिक है।

तो, मैं सीएसएस फ़ाइलों में न्यूनतम प्रदर्शन लागत और अधिमानतः सिंटैक्स हाइलाइटिंग के साथ रेजर कैसे लिख सकता हूं?

  • क्या इसके लिए "अधिक पूर्ण" परियोजना है?
  • क्या मैं कैशिंग/संकलन प्राप्त करने के लिए उपर्युक्त परियोजना में सुधार कर सकता हूं? यदि हां, तो कैसे?

एक तरफ ध्यान दें के रूप में:
मैं एक परियोजना RazorJS बुलाया पाया। यह उसी कैशिंग के जावास्क्रिप्ट संस्करण की तरह है जिसे मैं अपने कैशिंग समर्थन के साथ सीएसएस के लिए चाहता हूं। मैं बस अपनी जरूरतों को स्पष्ट करने के लिए इसका जिक्र कर रहा हूं। मुझे वर्तमान में जावास्क्रिप्ट में रेजर का उपयोग करने की आवश्यकता नहीं है, लेकिन मुझे लगता है कि अगर मैं इसे सीएसएस के साथ बना देता हूं, तो जावास्क्रिप्ट के साथ एक ही काम करना बहुत कठिन नहीं होगा।

+0

आप सिंटैक्स हाइलाइट के बारे में बात करते रहते हैं आईएनजी, इसका रेज़र के साथ कुछ लेना देना नहीं है। यह विजुअल स्टूडियो है जो आपका संपादक करता है। आप इसे प्राप्त करने की कोशिश कर रहे हैं, आप अपने सीएसएस में 'रेज़र' क्यों चाहते हैं? – TJHeuvel

+3

@TJHeuvel क्यों किसी को भी अपने एचटीएमएल में रेज़र चाहिए? लोग सर्वर-साइड स्क्रिप्टिंग भाषाओं का उपयोग क्यों करते हैं? क्योंकि वे अपने पृष्ठों को गतिशील होना चाहते हैं। इस तरह वे एक HTML फ़ाइल के बजाय डेटाबेस में अपने डेटा को स्टोर कर सकते हैं। तो मैं अपने सीएसएस में रेज़र क्यों चाहता हूं क्योंकि मैं चाहता हूं कि मेरा सीएसएस गतिशील भी हो। मैं अपने डेटाबेस (जैसे पृष्ठभूमि-रंग) में डिज़ाइन से संबंधित डेटा रख सकता हूं और इसे अपने सीएसएस में उपयोग करना चाहता हूं। इंटेलिजेंस के लिए, विजुअल स्टूडियो इस क्विस्टन के टैग में से एक है। मैं जानना चाहता हूं कि मैं कैसे कर सकता हूं (अगर मैं कर सकता हूं) सीएसएस फाइलों में रेज़र इंटेलिजेंस का उपयोग करता हूं और जैसा कि मैंने बताया है कि यह मेरे लिए सिर्फ एक माध्यमिक चीज है। –

+0

@ d4wn: आप अपने सीएसएस को गतिशील क्यों करना चाहते हैं? SASS/LESS और व्यू इंजन दृष्टिकोण के बीच काफी अंतर है, बाद के मामले में आप केवल क्लाइंट गैर-कैश किए गए सामान भेज रहे हैं जो केवल स्थिर हो सकते हैं ...: S –

उत्तर

29

आप एक कस्टम दृश्य इंजन बना सकते हैं:

public class CSSViewEngine : RazorViewEngine 
{ 
    public CSSViewEngine() 
    { 
     ViewLocationFormats = new[] 
     { 
      "~/Views/{1}/{0}.cscss", 
      "~/Views/Shared/{0}.cscss" 
     }; 
     FileExtensions = new[] { "cscss" }; 
    } 

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) 
    { 
     controllerContext.HttpContext.Response.ContentType = "text/css"; 
     return base.CreateView(controllerContext, viewPath, masterPath); 
    } 
} 

और भी Application_Start में एक कस्टम एक्सटेंशन के साथ रजिस्टर:

ViewEngines.Engines.Add(new CSSViewEngine()); 
RazorCodeLanguage.Languages.Add("cscss", new CSharpRazorCodeLanguage()); 
WebPageHttpHandler.RegisterExtension("cscss"); 

और web.config अंदर निर्माण प्रदाता के साथ विस्तार सहयोगी:

<compilation debug="true" targetFramework="4.0"> 
    <assemblies> 
     ... 
    </assemblies> 

    <buildProviders> 
     <add extension=".cscss" type="System.Web.WebPages.Razor.RazorBuildProvider, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 
    </buildProviders> 
</compilation> 

[नोट, यदि आपको असेंबली बाध्यकारी त्रुटि मिलती है तो आपको रेजर इंजन के अपने संस्करण से मेल खाने के लिए एक्सटेंशन प्रकार में संस्करण संख्या को बदलने की आवश्यकता हो सकती है। System.Web.WebPages के संदर्भ के गुणों को देखकर आप देख सकते हैं कि आप किस संस्करण का उपयोग कर रहे हैं।

public class StylesController : Controller 
{ 
    public ActionResult Foo() 
    { 
     var model = new MyViewModel 
     { 
      Date = DateTime.Now 
     }; 
     return View(model); 
    } 
} 

और एक इसी दृश्य:: (~/Views/Styles/Foo.cscss):

@model AppName.Models.MyViewModel 

/** This file was generated on @Model.Date **/ 

body { 
    background-color: Red; 
} 

जो अब के रूप में शामिल किया जा सकता अपनी परियोजना में उस्तरा विधानसभा]

और अंतिम चरण के कुछ नियंत्रक है लेआउट में एक शैली:

<link href="@Url.Action("Foo", "Styles")" rel="stylesheet" type="text/css" /> 
+3

यही वही है जो मैं ढूंढ रहा था, धन्यवाद आप। मेरी अगली खोज यह है कि वीएस को ** के लिए कुछ वाक्यविन्यास higlighting (और इंटेलिजेंस) कैसे करें। Cscss ** फ़ाइलें, मुझे लगता है। –

+1

@ डारिन डिमिट्रोव मैंने इस कोड की प्रतिलिपि बनाई है। और जब मैं वीएस में अपने एएसपीएनटी एमवीसी 3 समाधान को संकलित करना चाहता हूं तो मुझे यह त्रुटि मिली: त्रुटि "~/Views/Styles/Test.cscss" के लिए कोड भाषा निर्धारित नहीं कर सका। AMS \ AMS \ ASPNETCOMPILER कोई विचार क्यों? – elranu

+0

@ डारिन, कोड का कमाल है लेकिन मैं सोच रहा हूं कि इसे कम फ़ाइल की सेवा के लिए कैसे संशोधित किया जा सकता है क्योंकि इसमें व्याख्या का एक अतिरिक्त स्तर शामिल है ... विचार? – ekkis