ASP.NET MVC देखें इंजन तुलना


339

मैं ASP.NET MVC के लिए उपलब्ध विभिन्न दृश्य इंजनों के टूटने के लिए SO और Google पर खोज कर रहा हूं, लेकिन एक दृश्य इंजन क्या है के सरल उच्च-स्तरीय विवरणों की तुलना में बहुत अधिक नहीं मिला है।

मैं जरूरी नहीं कि "सर्वश्रेष्ठ" या "सबसे तेज" की तलाश कर रहा हूं, बल्कि विभिन्न परिस्थितियों के लिए प्रमुख खिलाड़ियों (जैसे डिफ़ॉल्ट WebFormViewEngine, MvcContrib View Engines, आदि) के फायदे / नुकसान की वास्तविक दुनिया की तुलना करता है। मुझे लगता है कि यह निर्धारित करने में वास्तव में सहायक होगा कि क्या डिफ़ॉल्ट इंजन से स्विचिंग किसी दिए गए प्रोजेक्ट या विकास समूह के लिए फायदेमंद होगा।

क्या किसी ने ऐसी तुलना का सामना किया है?


43
विडंबना यह है कि यह "रचनात्मक नहीं है" अभी तक इसमें शामिल लोगों को बहुत अधिक मूल्य प्रदान किया है जिन्होंने इसे लगभग 45K बार देखा है। बहुत बुरा है कि एसओ समुदाय की जरूरतों के बावजूद अपनी खुद की उपयोगिता को प्रतिबंधित कर रहा है। मुझे शक है @ jeff-atwood उस तरह महसूस होगा।
mckamey

जवाबों:


430

ASP.NET MVC व्यू इंजन (सामुदायिक विकी)

चूंकि एक व्यापक सूची मौजूद नहीं है, इसलिए एसओ पर यहां एक शुरू करें। ASP.NET MVC समुदाय के लिए यह बहुत महत्वपूर्ण हो सकता है यदि लोग अपने अनुभव (किसी को भी, जो इनमें से किसी एक में योगदान करते हैं) जोड़ते हैं। कुछ भी लागू करने IViewEngine(जैसे VirtualPathProviderViewEngine) यहाँ उचित खेल है। बस नए व्यू इंजन (वेबफ़ॉर्मव्यूइन और रेजर को शीर्ष पर छोड़कर) को वर्णानुक्रम में लिखें, और तुलना करने के उद्देश्य से प्रयास करें।


System.Web.Mvc.WebFormViewEngine

डिज़ाइन लक्ष्य:

एक दृश्य इंजन जो वेब प्रपत्र पेज को प्रतिक्रिया के लिए रेंडर करने के लिए उपयोग किया जाता है।

पेशेवरों:

  • सर्वव्यापी क्योंकि यह ASP.NET MVC के साथ जहाज करता है
  • ASP.NET डेवलपर्स के लिए परिचित अनुभव
  • IntelliSense
  • किसी भी भाषा को कोडडॉम प्रदाता (जैसे C #, VB.NET, F #, Boo, Nemerle) के साथ चुन सकते हैं
  • ऑन-डिमांड संकलन या पूर्वनिर्धारित विचार

विपक्ष:

  • उपयोग "क्लासिक ASP.NET" पैटर्न के अस्तित्व से उलझन में है जो अब MVC में लागू नहीं होता है (जैसे ViewState PostBack)
  • "टैग सूप" के विरोधी पैटर्न में योगदान कर सकते हैं
  • कोड-ब्लॉक सिंटैक्स और मजबूत-टाइपिंग रास्ते में प्राप्त कर सकते हैं
  • IntelliSense इनलाइन कोड ब्लॉक के लिए हमेशा उपयुक्त नहीं शैली को लागू करता है
  • सरल टेम्पलेट्स डिजाइन करते समय शोर हो सकता है

उदाहरण:

<%@ Control Inherits="System.Web.Mvc.ViewPage<IEnumerable<Product>>" %>
<% if(model.Any()) { %>
<ul>
    <% foreach(var p in model){%>
    <li><%=p.Name%></li>
    <%}%>
</ul>
<%}else{%>
    <p>No products available</p>
<%}%>

System.Web.Razor

डिज़ाइन लक्ष्य:

पेशेवरों:

  • कॉम्पैक्ट, एक्सप्रेसिव और फ्लुइड
  • सीखने में आसान
  • नई भाषा नहीं है
  • महान अंतर्मुखी है
  • इकाई परीक्षण योग्य
  • सर्वव्यापी, ASP.NET MVC के साथ जहाज

विपक्ष:

  • ऊपर संदर्भित "टैग सूप" से थोड़ी अलग समस्या पैदा करता है। जहां सर्वर टैग वास्तव में सर्वर और गैर-सर्वर कोड के आसपास संरचना प्रदान करते हैं, रेजर HTML और सर्वर कोड को भ्रमित करता है, जिससे शुद्ध एचटीएमएल या जेएस विकास चुनौतीपूर्ण होता है (कॉन उदाहरण # 1 देखें) जब आप एचटीएमएल और / या जावास्क्रिप्ट से बचते हैं। कुछ बहुत ही सामान्य परिस्थितियों में टैग।
  • खराब इनकैप्सुलेशन + रीससबिलिटी: रेजर टेम्पलेट को कॉल करना अव्यावहारिक है जैसे कि यह एक सामान्य तरीका था - व्यवहार में रेजर कोड को कॉल कर सकता है लेकिन इसके विपरीत नहीं, जो कोड और प्रस्तुति के मिश्रण को प्रोत्साहित कर सकता है।
  • सिंटैक्स बहुत HTML-उन्मुख है; गैर-html सामग्री उत्पन्न करना मुश्किल हो सकता है। इसके बावजूद, रेज़र का डेटा मॉडल अनिवार्य रूप से केवल स्ट्रिंग-संघनन है, इसलिए वाक्यविन्यास और नेस्टिंग त्रुटियों को न तो सांख्यिकीय रूप से और न ही गतिशील रूप से पता लगाया जाता है, हालांकि VS.NET डिज़ाइन-टाइम मदद इसे कुछ हद तक कम करती है। स्थिरता और शोधन क्षमता इसके कारण पीड़ित हो सकते हैं।
  • कोई दस्तावेज़ API , http://msdn.microsoft.com/en-us/library/system.web.razor.aspx

कॉन उदाहरण # 1 ("स्ट्रिंग [] ..." के स्थान पर ध्यान दें):

@{
    <h3>Team Members</h3> string[] teamMembers = {"Matt", "Joanne", "Robert"};
    foreach (var person in teamMembers)
    {
        <p>@person</p>
    }
}

Bellevue

डिजाइन लक्ष्य:

  • HTML को प्रथम श्रेणी की भाषा के रूप में सम्मान दें, इसे "सिर्फ पाठ" के रूप में मानने का विरोध किया।
  • मेरे HTML के साथ गड़बड़ मत करो! डेटा बाइंडिंग कोड (बेलव्यू कोड) HTML से अलग होना चाहिए।
  • सख्त मॉडल-व्यू पृथक्करण लागू करें

Brail

डिज़ाइन लक्ष्य:

Microsoft ASP.NET MVC फ्रेमवर्क के साथ काम करने के लिए मोनोल से ब्रेल व्यू इंजन को पोर्ट किया गया है। ब्रेल से परिचय के लिए, कैसल प्रोजेक्ट वेबसाइट पर प्रलेखन देखें ।

पेशेवरों:

  • "कलाई के अनुकूल अजगर सिंटैक्स" के बाद मॉडलिंग की गई
  • मांग पर संकलित विचार (लेकिन कोई पूर्वसर्ग उपलब्ध नहीं है)

विपक्ष:

  • बोओ भाषा में लिखा गया है

उदाहरण:

<html>    
<head>        
<title>${title}</title>
</head>    
<body>        
     <p>The following items are in the list:</p>  
     <ul><%for element in list:    output "<li>${element}</li>"%></ul>
     <p>I hope that you would like Brail</p>    
</body>
</html>

Hasic

हैसिक अधिकांश अन्य दृश्य इंजनों की तरह स्ट्रिंग्स के बजाय VB.NET के XML शाब्दिक का उपयोग करता है।

पेशेवरों:

  • मान्य XML का संकलन-समय की जाँच
  • सिंटेक्स रंग
  • पूर्ण अंतर्मुखी
  • संकलित विचार
  • नियमित सीएलआर कक्षाओं, कार्यों, आदि का उपयोग करते हुए विस्तार
  • यह नियमित रूप से VB.NET कोड के बाद से सहज क्षमता और हेरफेर
  • इकाई परीक्षण योग्य

विपक्ष:

  • प्रदर्शन: क्लाइंट को भेजने से पहले पूरे डोम का निर्माण करता है।

उदाहरण:

Protected Overrides Function Body() As XElement
    Return _
    <body>
        <h1>Hello, World</h1>
    </body>
End Function

NDjango

डिज़ाइन लक्ष्य:

NDjango F # भाषा का उपयोग करते हुए .NET प्लेटफॉर्म पर Django टेम्प्लेट लैंग्वेज का कार्यान्वयन है ।

पेशेवरों:


NHaml

डिज़ाइन लक्ष्य:

Rails Haml व्यू इंजन का .NET पोर्ट। से Haml वेबसाइट :

Haml एक मार्कअप लैंग्वेज है, जो बिना इनलाइन कोड के उपयोग के, बिना किसी वेब डॉक्यूमेंट के XHTML का साफ़-साफ़ वर्णन करने के लिए उपयोग किया जाता है ... Haml स्पष्ट रूप से XHTML को टेम्पलेट में कोड करने की आवश्यकता से बचता है, क्योंकि यह वास्तव में XHTML का एक सार वर्णन है। गतिशील सामग्री उत्पन्न करने के लिए कुछ कोड के साथ।

पेशेवरों:

  • ट्रिक संरचना (यानी DRY)
  • अच्छी तरह से इंडेंट किया हुआ
  • स्पष्ट संरचना
  • सी # इन्टेलिसेंस (वी.एस.2008 विद रेशर)

विपक्ष:

  • मार्कअप की पहचान का लाभ उठाने के बजाय एक्सएचटीएमएल से एक अमूर्तता
  • VS2010 के लिए कोई इंटेलीजेंस नहीं

उदाहरण:

@type=IEnumerable<Product>
- if(model.Any())
  %ul
    - foreach (var p in model)
      %li= p.Name
- else
  %p No products available

NVelocityViewEngine (MvcContrib)

डिज़ाइन लक्ष्य:

NVelocity पर आधारित एक व्यू इंजन जो कि लोकप्रिय Java प्रोजेक्ट वेलोसिटी का .NET पोर्ट है ।

पेशेवरों:

  • पढ़ने / लिखने में आसान
  • संक्षिप्त कोड देखें

विपक्ष:

  • दृश्य पर उपलब्ध सहायक विधियों की सीमित संख्या
  • स्वचालित रूप से Visual Studio एकीकरण (IntelliSense, संकलन-समय की जाँच, या रीफ़ैक्टरिंग) नहीं है

उदाहरण:

#foreach ($p in $viewdata.Model)
#beforeall
    <ul>
#each
    <li>$p.Name</li>
#afterall
    </ul>
#nodata 
    <p>No products available</p>
#end

SharpTiles

डिज़ाइन लक्ष्य:

SharpTiles JSTL का एक आंशिक पोर्ट है, जिसे टाइल फ्रेमवर्क (माइल स्टोन 1 के रूप में) के पीछे अवधारणा के साथ जोड़ा गया है ।

पेशेवरों:

  • जावा डेवलपर्स के लिए परिचित
  • XML- शैली कोड ब्लॉक

विपक्ष:

  • ...

उदाहरण:

<c:if test="${not fn:empty(Page.Tiles)}">
  <p class="note">
    <fmt:message key="page.tilesSupport"/>
  </p>
</c:if>

स्पार्क व्यू इंजन

डिज़ाइन लक्ष्य:

विचार html को प्रवाह और कोड को मूल रूप से फिट करने की अनुमति देता है।

पेशेवरों:

विपक्ष:

  • शाब्दिक मार्कअप से टेम्पलेट लॉजिक का कोई स्पष्ट पृथक्करण नहीं (इसे नामस्थान उपसर्गों के द्वारा कम किया जा सकता है)

उदाहरण:

<viewdata products="IEnumerable[[Product]]"/>
<ul if="products.Any()">
    <li each="var p in products">${p.Name}</li>
</ul>
<else>
    <p>No products available</p>
</else>

<Form style="background-color:olive;">
    <Label For="username" />
    <TextBox For="username" />
    <ValidationMessage For="username" Message="Please type a valid username." />
</Form>

StringTemplate देखें इंजन MVC

डिज़ाइन लक्ष्य:

  • लाइटवेट। कोई पृष्ठ कक्षाएं नहीं बनाई गई हैं।
  • तेज। टेम्पलेट रिस्पांस आउटपुट स्ट्रीम के लिए लिखे गए हैं।
  • कैश्ड। टेम्प्लेट कैश्ड हैं, लेकिन फ़ाइल परिवर्तनों का पता लगाने के लिए FileSystemWatcher का उपयोग करें।
  • गतिशील। कोड में मक्खी पर टेम्प्लेट उत्पन्न किए जा सकते हैं।
  • लचीला। टेम्प्लेट्स को किसी भी स्तर पर नेस्ट किया जा सकता है।
  • एमवीसी सिद्धांतों के अनुरूप। UI और बिजनेस लॉजिक को अलग करने को बढ़ावा देता है। सभी डेटा समय से पहले बनाया जाता है, और टेम्पलेट को पास कर दिया जाता है।

पेशेवरों:

  • StringTemplate जावा डेवलपर्स के लिए परिचित

विपक्ष:

  • सरलीकृत टेम्पलेट सिंटैक्स इच्छित आउटपुट (जैसे jQuery संघर्ष ) के साथ हस्तक्षेप कर सकता है

विंग बीट्स

विंग बीट्स एक्सएचटीएमएल बनाने के लिए एक आंतरिक डीएसएल है। यह F # पर आधारित है और इसमें ASP.NET MVC व्यू इंजन शामिल है, लेकिन इसका उपयोग XHTML बनाने की अपनी क्षमता के लिए भी किया जा सकता है।

पेशेवरों:

  • मान्य XML का संकलन-समय की जाँच
  • सिंटेक्स रंग
  • पूर्ण अंतर्मुखी
  • संकलित विचार
  • नियमित सीएलआर कक्षाओं, कार्यों, आदि का उपयोग करते हुए विस्तार
  • यह नियमित रूप से एफ # कोड के बाद से निर्बाध संरचना और हेरफेर
  • इकाई परीक्षण योग्य

विपक्ष:

  • आप वास्तव में HTML नहीं लिखते हैं, लेकिन एक DSL में HTML का प्रतिनिधित्व करने वाला कोड।

XsltViewEngine (MvcContrib)

डिज़ाइन लक्ष्य:

परिचित XSLT से विचार बनाता है

पेशेवरों:

  • व्यापक रूप से सर्वव्यापी
  • XML डेवलपर्स के लिए परिचित टेम्पलेट भाषा
  • XML- आधारित
  • समय परीक्षण किया
  • सिंटैक्स और एलिमेंट नेस्टिंग की त्रुटियों का सांख्यिकीय रूप से पता लगाया जा सकता है।

विपक्ष:

  • कार्यात्मक भाषा शैली प्रवाह नियंत्रण को कठिन बनाती है
  • XSLT 2.0 (शायद?) समर्थित नहीं है। (XSLT 1.0 बहुत कम व्यावहारिक है)।


9
@ ब्रायनली: क्योंकि एफ # संकलित और कार्यात्मक है, जिसका अर्थ है कि यह तेजी से है, बाकी रनटाइम के साथ अधिक अंतर (कम से कम सी # 4 तक), और बेरोजगार। हम सबसे पहले लौहपथ मार्ग पर गए, लेकिन परिणामों से खुश नहीं थे। जहाँ तक नामकरण - हम सुझावों के लिए खुले हैं :)
kolosy

7
शैतान के विपक्ष वर्ग के कारण डाउन वोटिंग। भाषा के रूप में बू होना निश्चित रूप से एक कोन नहीं है।
ओवेन

48
@ ओवेन: हाँ यह है। आपको इसे C # डेवलपर के नजरिए से देखना होगा। आप अभी तक एक और भाषा का उपयोग नहीं करना चाहते हैं एक अस्थायी इंजन का उपयोग करें। (स्वाभाविक रूप से अगर आप पहले से ही बू को जानते हैं, तो वह शांत है, लेकिन सी # डेवलपर्स के बहुमत के लिए, यह एक अतिरिक्त बाधा है)
क्रिश्चियन क्लासर

5
उस्तरा है। यह रेजर को वर्णानुक्रम में अद्यतन किया जाना चाहिए।
मैकेमी जूल

3
बू एक प्रो है, कॉन नहीं। आप पहले से ही "सी" के बाहर हैं, टेंसर टेम्पलेट बेहतर आ सकता है। C # का उपयोग "टेम्प्लेटिंग" संदर्भ में करने के लिए नहीं था, यह कुछ हद तक अभिव्यंजक है लेकिन "कलाई के अनुकूल" नहीं है। दूसरी ओर, BOO को ध्यान में रखते हुए बनाया गया था और इस तरह यह एक अस्थायी संदर्भ में उपयोग किए जाने के लिए बहुत बेहतर है।
लाउडेनवियर

17

मेरी वर्तमान पसंद रेजर है। यह पढ़ने में बहुत साफ और आसान है और दृश्य पृष्ठों को बनाए रखना बहुत आसान है। अंतर्मुखी समर्थन भी है जो वास्तव में महान है। ALos, जब वेब सहायकों के साथ प्रयोग किया जाता है तो यह वास्तव में बहुत शक्तिशाली है।

एक साधारण नमूना प्रदान करने के लिए:

@Model namespace.model
<!Doctype html>
<html>
<head>
<title>Test Razor</title>
</head>
<body>
<ul class="mainList">
@foreach(var x in ViewData.model)
{
<li>@x.PropertyName</li>
}
</ul>
</body>

आखिर तुमने इसे हासिल कर ही लिया है। यह बहुत साफ है और पढ़ने में आसान है। दी, यह एक सरल उदाहरण है, लेकिन जटिल पृष्ठों और रूपों पर भी इसे पढ़ना और समझना बहुत आसान है।

विपक्ष के लिए के रूप में? अच्छी तरह से अब तक (मैं इसके लिए नया हूं) कुछ हेल्पर्स का उपयोग करते समय रूपों के लिए सीएसएस वर्ग के संदर्भ को जोड़ने के लिए समर्थन की कमी है जो थोड़ा कष्टप्रद है।

धन्यवाद नाथज ० N


1
रवींद्र! बस गौर किया कि यह चर्चा कितनी पुरानी है। ओह ठीक है, शायद किसी को मिल जाएगा और यह अभी भी उपयोगी साबित होगा।
नाथज

10

मुझे पता है कि यह वास्तव में आपके सवाल का जवाब नहीं देता है, लेकिन अलग-अलग व्यू इंजन के अलग-अलग उद्देश्य हैं। स्पार्क देखें इंजन , उदाहरण के लिए, उद्देश्य "टैग सूप" के अपने विचार सब कुछ धाराप्रवाह और पठनीय बनाने के लिए कोशिश कर रहा द्वारा छुटकारा।

आपका सबसे अच्छा दांव सिर्फ कुछ क्रियान्वयनों को देखना होगा। यदि यह आपके समाधान के इरादे से अपील करता है, तो इसे आज़माएं। आप MVC में व्यू इंजन को मिक्स एंड मैच कर सकते हैं, इसलिए यदि आप किसी विशिष्ट इंजन के साथ नहीं जाने का निर्णय लेते हैं तो यह एक मुद्दा नहीं होना चाहिए।


जवाब के लिए धन्यवाद। मैं वस्तुतः वही शुरू कर रहा था जो आपने सुझाया था जब मुझे लगा कि "किसी को पहले ही सारांश करना पड़ा है।" मैं इन प्रकार के डिज़ाइन लक्ष्यों और कमियों के कुछ एकत्रीकरण की उम्मीद कर रहा हूं। "स्पार्क व्यू इंजन ... का उद्देश्य सब कुछ धाराप्रवाह और पठनीय बनाने की कोशिश करके" टैग सूप "के अपने विचारों से छुटकारा पाना है।" इसका मतलब है कि इसे बनाने का एक कारण और साथ ही डिफ़ॉल्ट दृश्य इंजन की कमी है। सूची में एक और गोली।
mckamey

7

इस SharpDOM की जाँच करें । यह html उत्पन्न करने के लिए एसी # 4.0 आंतरिक डीएसएल है और साथ ही asp.net mvc view engine है।


विचारों को बनाने का एकमात्र उचित तरीका लगता है।
Stephan Eggermont

क्या आप इसे सामान्य विकि उत्तर में जोड़ सकते हैं?
मौरिसियो शेफ़र

मैं इसे अब CodePlex या Google पर नहीं ढूंढ सकता। यह कहाँ गया?? (यह अभी भी कोडप्रोजेक्ट पर है: codeproject.com/Articles/667581/… )
जेरेड थिरस्क

5

मुझे ndjango पसंद है । यह उपयोग करने में बहुत आसान है और बहुत लचीला है। आप आसानी से कस्टम टैग और फिल्टर के साथ कार्यक्षमता का विस्तार कर सकते हैं। मुझे लगता है कि "एफ # से बहुत बंधा हुआ" नुकसान के बजाय लाभ है।


4

मुझे लगता है कि इस सूची में प्रत्येक दृश्य इंजन के नमूने भी शामिल होने चाहिए ताकि उपयोगकर्ताओं को हर वेबसाइट पर जाने के बिना प्रत्येक का स्वाद मिल सके।

चित्र कहते हैं कि एक हजार शब्द और मार्कअप नमूने व्यू इंजन के स्क्रीनशॉट की तरह हैं :) तो यहां मेरा पसंदीदा स्पार्क व्यू इंजन है

<viewdata products="IEnumerable[[Product]]"/>
<ul if="products.Any()">
  <li each="var p in products">${p.Name}</li>
</ul>
<else>
  <p>No products available</p>
</else>

4
बहुत अधिक ठंड लग रही है। मैं इस तरह मार्कअप में कोड मिश्रण का एक बड़ा प्रशंसक नहीं हूँ। इसे बनाए रखना मुश्किल हो जाता है।
चंचल जेडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.