2009-04-06 18 views
13

अब मैंने एएसपी.नेट एमवीसी और कुल मिलाकर अपना पहला वेब एप्लिकेशन पूरा कर लिया है, मैं अभी भी समझ नहीं रहा हूं कि यह सभी प्रशंसा और महिमा क्यों प्राप्त कर रहा है। शायद मैं जिद्दी हो रहा हूँ। मुझे पता है कि एमवीसी महान बनाता है जो प्रस्तुति परत और व्यापार वस्तु या डेटा परत के बीच अपने स्टेटलेस ऑपरेशन के साथ अलगाव को बल देता है। मुझे यह भी पता है कि जब आप दृश्य के साथ काम कर रहे हैं, ऐसा लगता है कि कोड कम पठनीय है (नीचे मेरा उदाहरण देखें)।एएसपी.नेट एमवीसी> एएसपी.नेट वेबफॉर्म, क्यों?

तो मुझे लगता है कि मेरा सवाल है ... यदि अलगाव चिंता है, तो क्यों न केवल अलग।

//UI 
<h2><asp:Label ID="lblPageHeader" runat="server" /></h2> 

वेब प्रपत्र कोड पीछे:: ​​

//CODE BEHIND 
this.lblPageHeader.Text = myObject.Header; 

MVC कोड दृश्य:

//UI 
<h2><%= Html.Encode(Model.PageTitle) %></h2> 

वेब प्रपत्र कोड देखें 0 MVC नियंत्रक कोड:

index = new Index 
{ 
    PageText = sb.ToString(), 
    PageTitle = "WELCOME" 
}; 
return View(index); 

फिर से, मैं जिद्दी जा रहा है हो सकता है, लेकिन चीजें हैं जो मैं वास्तव में WebForms में पसंद से एक datasources और पाठ मानों की तरह वस्तु गुण स्थापित करने में आसानी है। ऐसा लगता है कि यह एमवीसी में पूरी तरह से अलग है और कम पठनीय है जो मुझे दीर्घकालिक रखरखाव के बारे में आश्चर्यचकित करता है।

संपादित टाइप किया मॉडल में देखने के बाद, मैं कोड की पठनीयता काफी हद तक सुधार हुआ है लगता है।

+0

@tweakt लगता है की मेरी ग्राफ देखें - संपादित करें के लिए धन्यवाद! अच्छी पकड़। – RSolberg

उत्तर

14

ASP.NET MVC Best Practices, Tips and Tricks

मैं लिखने होगा:

<h2><%= Html.Encode(Model.Title) %></h2> 

<h2><%= Html.Encode((MyApp.MyObject)ViewData["PageObject"].Header) %></h2> 

की

बजाय (यह लिखे गए विचारों का एक मदद से संभव है) मुझे लगता है कि इसके बारे में कैसे तुम सब है इसका इस्तेमाल करें। यदि आप क्लासिक एएसपी.नेट से अधिक खुश हैं, तो शायद इससे बेहतर रहना बेहतर होगा। इसके अलावा, आप एएसपी.नेट एमवीसी दुनिया (जैसे यूआई और लॉजिक अलगाव) से अच्छी चीजें भी ले सकते हैं और इसे क्लासिक एएसपी.नेट पर ला सकते हैं।

+0

जबकि "आप इसका उपयोग कैसे करते हैं" ऐसा लगता है कि यह हमेशा समझ में आता है और सबकुछ के लिए लागू होता है, यह वास्तव में प्रश्न को हल करने के लिए कुछ भी नहीं करता है ... मुझे टाइप किए गए विचारों के बारे में पता नहीं था। मैं उनको देख रहा हूं। – RSolberg

+0

टाइप किए गए विचार एफटीडब्ल्यू! निश्चित नहीं है कि जब भी मैं एक गैर-टाइप किए गए दृश्य का उपयोग करता हूं। – Webjedi

2

बेशक एक साधारण उदाहरण बहुत स्पष्ट और पठनीय होने जा रहा है इससे कोई फर्क नहीं पड़ता कि आप इसे कैसे करते हैं। माना जाता है कि जब आप जटिलता को बढ़ाते हैं तो एमवीसी का लाभ अधिक स्पष्ट हो जाता है।

इसके अलावा, यह पता चला है कि वेबफॉर्म मॉडल सिर्फ उच्च मात्रा वाली सार्वजनिक इंटरनेट साइटों के लिए बहुत अच्छा नहीं है। व्यूस्टेट प्लस एक सामान्य वेब फॉर्म साइट में महंगा पृष्ठ जीवन चक्र स्केलेबिलिटी को चुनौती दे सकता है (असंभव नहीं, लेकिन चुनौतीपूर्ण)। इसके विपरीत, एक int आरए पर नेट साइट उपयोगकर्ताओं के पास आम तौर पर अधिक अपस्ट्रीम बैंडविड्थ (व्यूस्टेट बेहतर काम करता है) और वॉल्यूम बहुत बेहतर नियंत्रित होता है। तो वेबफॉर्म वास्तव में महान काम करता है।

+0

क्या एएसपी.नेट एमवीसी ग्राहक पर राज्य जारी नहीं रखता है? यदि हां, तो क्या यह एक छिपे हुए फॉर्म फ़ील्ड के अलावा कुछ और उपयोग करता है? (उदाहरण के लिए, कुकीज़, इत्यादि ...) यदि आप बहुत बड़े हैं (और trace.axd आपको इसका आकार बताता है) आप दृश्य स्थिति को बंद कर सकते हैं ... –

+0

एमवीसी उपयोगकर्ता नियंत्रण को उसी तरह से नहीं करता है , वेबफॉर्म में कभी-कभी देखा जाने वाला राज्य की समस्याएं बहुत अधिक मौजूद नहीं होती हैं। हां, आप वेबफॉर्म में व्यूस्टेट को बंद कर सकते हैं, लेकिन फिर आपको पूर्ण वेबफॉर्म उपचार नहीं मिल रहा है, या तो। मैं वास्तव में अधिकांश समय वेबफॉर्म पसंद करता हूं :) –

+0

अहह, मुझे एएसपी.नेट एमवीसी की जांच करनी होगी। मैं डिफ़ॉल्ट रूप से व्यूस्टेट को बंद करने के लिए प्रतिबद्ध था, फिर इसे नियंत्रित करने के लिए इसे चालू करें। PERL cgi-scripts से आ रहा है ViewState एक freakin देवता था! –

0

मैं एएसपी.नेट एमवीसी (एंटीटी फ्रेमवर्क और विभिन्न कारणों से डब्ल्यूपीएफ के साथ) के बारे में प्रतीक्षा-और-दृष्टिकोण भी ले रहा हूं।मैं आम तौर पर एमवीसी का एक बड़ा प्रशंसक हूं लेकिन एक पैटर्न के बाधाओं में एक वेब विकास ढांचे के रूप में सामान्य उद्देश्य के रूप में कुछ लपेटने के बारे में थोड़ा चिंतित हूं। एक बहुत ही उपयोगी पैटर्न लेकिन अभी भी बहुत से लोगों में से 1।

एक कुशल डेवलपर व्यावहारिक रूप से किसी भी भाषा में एमवीसी को कार्यान्वित कर सकता है। तो एमवीसी कम कुशल डेवलपर्स को रोकने के लिए एक शानदार तरीका हो सकता है (हम सब कुछ इस समय हैं, जैसे कि सिर्फ ढांचे को सीखना) गंभीर गलतियों से। चूंकि पैटर्न परिदृश्यों की एक विस्तृत श्रृंखला में अच्छी तरह से काम करता है जो इसे शुद्ध लाभ प्रदान कर सकता है।

दूसरी ओर, विशेषज्ञ डेवलपर्स के लिए यह एक ओलंपिक साइकिल चालक पर प्रशिक्षण पहियों की तरह हो सकता है ... एक वरदान से अनावश्यक और अधिक दर्द।

+0

आपको यह लेख पढ़ना चाहिए :) www.artima.com/weblogs/viewpost.jsp?thread=104707 –

2

यह सच है कि आपको कुछ बुनियादी मूलभूत कार्यक्षमता प्राप्त करने के लिए एमवीसी में और अधिक करने की आवश्यकता है जो आप वेबफॉर्म में आदी हो गए हैं।

हालांकि, लंबे समय तक आप अधिक नियंत्रण के साथ समाप्त होते हैं।

वेबफॉर्म के बारे में मुख्य बात तोड़ दी गई है पूरे पोस्टबैक परिदृश्य, और कुछ सरल वेबफॉर्म को लागू करने के लिए आपको कितने हुप्स को कूदना है, इस बारे में नहीं सोचा था। एक उत्कृष्ट उदाहरण है मेरे वेबफॉर्म से संबंधित प्रश्न: Is there any native way in ASP.NET to do a "success message"?

मैं वेबफॉर्म एप्लिकेशन में "रिकॉर्ड सहेजा गया" या "नया रिकॉर्ड जोड़ा गया" संदेश बनाना चाहता था। यह आसान काम करने के लिए आपको कुछ सचमुच डरावनी चीजें करना है, क्योंकि उनके पास वेबफॉर्म में ऐसा करने का कोई सामान्य तरीका नहीं है, और एक कस्टम विधि करने के लिए, आप छिपी हुई कार्यक्षमता के खिलाफ लड़ रहे हैं पोस्टबैक में।

एमवीसी में, यह कोई समस्या नहीं होगी। आपको अभी भी कार्यक्षमता मैन्युअल रूप से लिखनी होगी, लेकिन आपके पृष्ठ स्थिति पर आपका अधिक नियंत्रण होगा।

+0

एक खाली लेबल जो सेट हो जाता है (और संभवतः रंगीन हरा) यह नहीं करेगा? मैंने प्रपत्र पैनल बनाम सफलता पैनल पैटर्न का उपयोग करने के लिए प्रयास किया - एक बार फॉर्म सफलतापूर्वक सबमिट किया गया था फॉर्म पैनल अदृश्य बना दिया गया है और सफलता पैनल दिखाई देता है (हरे रंग की सफलता संदेश के साथ) –

+0

अरन्शिया के साथ सहमत - मेरे मास्टर पेज पर मेरे पास विधियां हैं ShowError, ShowSuccess और एक स्थान जहां/इस तरह की सामग्री को प्रदर्शित करने के लिए। – Rashack

+0

क्या आप लोग मुझे नीचे जाने से पहले प्रवेश और उसके जवाब देख रहे थे? यह मेरे लिए इतना आसान नहीं लग रहा था। – danieltalsky

2

मेरा मानना ​​है कि आप केवल एक बड़ी परियोजना में होने के बाद अंतर महसूस कर सकते हैं और देखा कि वेबफॉर्म दृष्टिकोण कितना गड़बड़ कर सकता है।

जब आपने एक पृष्ठ को देखा है तो कई घटक होते हैं, उपयोगकर्ता नियंत्रण, उनमें से कुछ स्वतंत्र जीवन जीते हैं जैसे छिपाने/दिखाने या सक्षम/अक्षम करने के लिए, ये सभी नियम एकाधिक नियंत्रण परतों से गुजरते हैं जिन्हें आपके द्वारा तब तक नहीं देखा जा सकता कई वर्षों तक एक परियोजना में रहा है (या कम से कम डीबगर के साथ डाइविंग से पहले कुछ रिएली अच्छा कर दिया है :)), जब आप देखते हैं कि आपका डेटा किस घटक को परिभाषित करता है, तो आप नियंत्रण के स्पष्ट रूप से परिभाषित प्रवाह की संभावना की सराहना करना शुरू करते हैं। किसी पृष्ठ पर कौन से गुण प्रस्तुत किए जाते हैं।

मुझे वेबफॉर्म को लंबे समय से भी पसंद आया है। मैंने आपको कुछ ही कारणों से एमवीसी के कुछ ही हफ्तों/नापसंदों को नापसंद किया। कुछ कोडिंग करने के बाद और अनुभव की तुलना कर सकते हैं, मैंने एमवीसी का आनंद लेना शुरू कर दिया।

फिर भी, ऐसे कुछ क्षेत्र हैं जहां एमवीसी दृष्टिकोण अधिक जटिल होगा और वेबफॉर्म की तुलना में अधिक गड़बड़ पैदा करेगा।

यह समय के साथ आएगा। वास्तव में एक लंबा समय नहीं है। :)

8

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

अब, एमवीसी सभी के लिए नहीं है। आप एएसपी.नेट फॉर्म के लिए एमवीपी (मॉडल-व्यू प्रेजेंटर) में देखना चाह सकते हैं क्योंकि यह बहुत ही समान एमवीसी अवधारणाओं का उपयोग करता है, सिवाय इसके कि प्रेजेंटर दृश्य के आंतरिक को बदलने के नियंत्रण में है।

लेकिन, टेस्टेबिलिटी वास्तव में आपके कोड का परीक्षण करने के लिए एक बड़ा प्लस है। जैसे whawt होता है जब किसी को ChangePassword विधि/कार्रवाई क्लिक करता है:

[TestClass] 
public class AccountControllerTest 
{ 

    [TestMethod] 
    public void ChangePasswordPostRedirectsOnSuccess() 
    { 
     // Arrange 
     AccountController controller = GetAccountController(); 

     // Act 
     RedirectToRouteResult result = 
      (RedirectToRouteResult)controller.ChangePassword(
       "oldPass", "newPass", "newPass"); 

     // Assert 
     Assert.AreEqual("ChangePasswordSuccess" 
      , result.RouteValues["action"]); 
    } 
} 
+1

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

+0

आप बिल्कुल सही जॉन हैं, और इसलिए मैंने ऊपर एमवीपी का उल्लेख किया है। एमवीसी/एमवीपी, यह आपके द्वारा लागू पैटर्न के बारे में सब कुछ है जो इसे टेस्ट करने योग्य बनाता है। विशिष्ट एएसपी.नेट फॉर्म ऐप्स में चिंता का स्तर नहीं है, इसलिए लोग केवल MyNameTextBox.Text = User.DisplayName और किए जाते हैं। :( – eduncan911

+0

एमवीसी/एमवीपी जैसे पैटर्न को लागू करने के लिए नियमों या दिशानिर्देशों का एक सेट प्रस्तुत किया गया है। उन दिशानिर्देशों के बिना, जो ब्लो डेवलपर सिर्फ कोड में वायरअप करेगा और किया जाएगा। – eduncan911

10

क्या ASP.NET MVC के बारे में बहुत अच्छा है कि है छिपाने के बारे में HTTP काम करता है की कोशिश नहीं करता है। एएसपी.नेट एमवीसी को पूरी तरह से समझने के लिए आपको वेब की प्रौद्योगिकियों को समझने की आवश्यकता है।

जबकि वेबफॉर्म पर्याप्त रूप से पर्याप्त हैं जब तक आप अपनी शक्तियों पर काम करते हैं, अंत में वे बहुत ही कमजोर अमूर्त होते हैं जब आप नहीं करते हैं। हालांकि इस बिंदु से व्यूस्टेट की कमी पर अच्छी तरह से चर्चा की गई है, मुझे लगता है कि यह अंतर्निहित दोष है कि Winforms के व्यवहार की नकल करने का बेहद मूर्ख प्रयास है - व्यूस्टेट केवल इसका एक उत्पाद है।

एएसपी.नेट के साथ जहाज वाले वेब नियंत्रण भी वांछित होने के लिए एक (नरक का एक) छोड़ देते हैं, जिसने किसी भी सुलभ वेबसाइट बनाने की कोशिश की है, उसे प्रमाणित किया जा सकता है। वेब नियंत्रण समझने की कुल कमी दिखाते हैं कि फ्रंटेंड विकास कैसे किया जाता है, और स्पष्ट रूप से अपमान है।

एएसपी.नेट एमवीसी के साथ वह सब बकवास दूर हो गया है। आप HTTP, HTML, CSS, या जावास्क्रिप्ट से संरक्षित नहीं हैं - यदि आप उन तकनीकों के साथ पार्टी में आते हैं तो ढांचा रास्ते से बाहर हो जाता है और आपको उनका लाभ उठाने देता है। यदि नहीं, तो शुक्र है कि यह आपको नाटक करने में मदद करने की कोशिश नहीं करता है कि वे मौजूद नहीं हैं।

0

मुझे लगता है कि यह आपकी पृष्ठभूमि पर निर्भर करता है। यदि आप रूबी-रेल और/या Django जैसे कुछ से पहले से परिचित हैं, तो एएसपीएनटी एमवीसी अधिक समझ में आता है।

यदि आप लंबे समय तक एचटीएमएल और सीएसएस में वेबसाइटें कर रहे हैं, तो एमवीसी बहुत बेहतर है क्योंकि आपके एचटीएमएल आउटपुट पर पूर्ण नियंत्रण है।

यदि आप एएसपीनेट के साथ सहज हैं तो बस इसका उपयोग करते रहें, यह दूर नहीं जा रहा है :)।

8

एक चीज़ (कई में से) जो मुझे एमवीसी के बारे में पसंद है वह यह है कि यह वेब सर्वर नियंत्रण से छुटकारा पाता है। जबकि वे वेबफॉर्म के बारे में बहुत से लोगों के रूप में देखे जाते हैं, मैंने पाया है कि एक बार जब आप बुनियादी परिचालनों को दूर कर लेते हैं तो वे एक दुःस्वप्न बन जाते हैं। पोस्टबैक के साथ ग्रिड पर डाटाबेसिंग घटनाओं को जोड़ना और बाकी सब कुछ स्पेगेटी कोड का ओओ संस्करण बन जाता है।

एमवीसी के लिए आपको वेब विकास (जीईटी, पोस्ट, रिक्वेस्ट, एचटीएमएल, सीएसएस, जावास्क्रिप्ट) के मूल किरायेदारों का बेहतर ज्ञान होना चाहिए, परिणाम बहुत बेहतर होगा। मैं कैसे MVC काम करता है :-)

alt text http://www.baseestate.com/webformsmvc.gif

संबंधित मुद्दे