2008-08-20 15 views
13

व्यू व्यू और एडिट व्यू अक्सर अविश्वसनीय रूप से समान होते हैं कि यह 2 विचार लिखने के लिए अनचाहे है। जैसे-जैसे ऐप विकसित होता है, आप दोनों में एक ही बदलाव कर रहे होंगे।एएसपी.नेट एमवीसी का उपयोग करके, व्यू व्यू और एडिट व्यू दोनों को लिखने से कैसे बचें?

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

तो, क्या मुझे एक व्यू डेटा क्लास बनाना चाहिए जिसमें दोनों विचारों के लिए सभी जानकारी शामिल हो, जहां आप जो ऑपरेशन कर रहे हैं उसके आधार पर, कुछ गुण शून्य हो जाएंगे?
क्या मुझे व्यू डेटा में ऑपरेशन को एनम के रूप में शामिल करना चाहिए?
क्या मुझे <% के साथ सभी सूक्ष्म मतभेदों को घेरना चाहिए यदि (ViewData.Model.Op == Ops.Editing) {%>?

या क्या कोई बेहतर तरीका है?

+0

हाँ! इसके लिए एक ही दृश्य का उपयोग करने में सक्षम होना अच्छा होगा: जोड़ें, संपादित करें और देखें ... –

उत्तर

4

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

यह तुम क्या तय कर दी है की तुलना में किसी भी अधिक सुंदर नहीं है, तो मुझे आश्चर्य है अगर Django या रेल लोग के किसी भी किसी भी इनपुट प्रदान कर सकते हैं।

मैं asp.net MVC के प्यार लेकिन यह अभी भी परिपक्व हो जाता है, और अभी भी अधिक चीनी वेबसाइट बनाने के घर्षण से कुछ दूर ले जाना जोड़ने की जरूरत है।

2

मैं व्यक्तिगत रूप से दृश्य में सही/if/else का उपयोग करना पसंद करता हूं। यह मुझे एक बार में देखने के लिए सब कुछ देखने में मदद करता है।

यदि आप टैग सूप से बचना चाहते हैं, तो भी मैं एक सहायक विधि बनाने का सुझाव दूंगा।

<%= Helper.ProfessionField() %> 

string ProfessionField() 
{ 
    if(IsNewItem) { return /* some drop down code */ } 
    else { return "<p>" + _profession+ "</p>"; }   
} 
5

यह वास्तव में बहुत आसान है। आइए मान लें कि आप एक ब्लॉग पोस्ट संपादित कर रहे हैं।

public class BlogController : Controller 
{ 
    public ActionResult New() 
    { 
     var post = new Post(); 
     return View("Edit", post); 
    } 

    public ActionResult Edit(int id) 
    { 
     var post = _repository.Get(id); 
     return View(post); 
    } 

    .... 

} 

यहाँ और दृश्य है:

यहाँ नए/संपादन के लिए अपने 2 कार्यों यहाँ

<% using(Html.Form("save")) { %> 
<%= Html.Hidden("Id") %> 

<label for="Title">Title</label> 
<%= Html.TextBox("Title") %> 

<label for="Body">Body</label> 
<%= Html.TextArea("Body") %> 

<%= Html.Submit("Submit") %> 
<% } %> 

और कार्रवाई सहेजें उस दृश्य प्रस्तुत है करने के लिए:

public ActionResult Save(int id, string title, string body) 
{ 
    var post = id == 0 ? new Post() : _repository.Get(id); 
    post.Title = title; 
    post.Body = body; 

    _repository.Save(post); 

    return RedirectToAction("list"); 
} 
+0

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

1

आप कस्टमव्यूडेटा क्लास निर्दिष्ट कर सकते हैं और यहां पैरामीटर पास कर सकते हैं।


public class MyViewData { 
    public bool IsReadOnly { get; set; } 
    public ModelObject MyObject { get; set; } 
} 

और दोनों विचारों को इस व्यूडेटा को लागू करना चाहिए। परिणामस्वरूप आप UserControl परिणाम प्रबंधित करने के लिए प्रदान की गई IsReadOnly प्रॉपर्टी का उपयोग कर सकते हैं।

नियंत्रक इस का उपयोग करता है के रूप में, आप इकाई यह परीक्षण कर सकते हैं और अपने विचार कार्यान्वयन नहीं है, तो आप MVC सिद्धांतों का सम्मान कर सकते हैं।

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