MVC नियमों को तोड़ने के बिना मास्टर पेज (ASP.NET MVC का उपयोग करके) को पास करने का आपका तरीका क्या है?
व्यक्तिगत रूप से, मैं अमूर्त नियंत्रक (बेस कंट्रोलर) या बेस क्लास को कोड करना पसंद करता हूं जिसे सभी विचारों के लिए पास किया जाता है।
MVC नियमों को तोड़ने के बिना मास्टर पेज (ASP.NET MVC का उपयोग करके) को पास करने का आपका तरीका क्या है?
व्यक्तिगत रूप से, मैं अमूर्त नियंत्रक (बेस कंट्रोलर) या बेस क्लास को कोड करना पसंद करता हूं जिसे सभी विचारों के लिए पास किया जाता है।
जवाबों:
यदि आप अपने विचार पसंद करते हैं, तो यह आपके लिए काम करने वाले डेटा वर्गों को दृढ़ता से टाइप कर सकता है। अन्य समाधान शायद अधिक सही हैं लेकिन यह डिजाइन और व्यावहारिकता IMHO के बीच एक अच्छा संतुलन है।
मास्टर पृष्ठ एक दृढ़ता से टाइप किया गया दृश्य डेटा वर्ग लेता है जिसमें केवल उसके लिए प्रासंगिक जानकारी होती है:
public class MasterViewData
{
public ICollection<string> Navigation { get; set; }
}
उस मास्टर पेज का उपयोग करने वाला प्रत्येक दृश्य अपनी जानकारी युक्त एक दृढ़ता से टाइप किया गया डेटा वर्ग लेता है और मास्टर पृष्ठों के डेटा को प्राप्त करता है:
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
}
चूंकि मैं व्यक्तिगत नियंत्रकों को मास्टर पेज डेटा को एक साथ रखने के बारे में कुछ भी जानना नहीं चाहता हूं, मैं उस तर्क को एक कारखाने में संलग्न करता हूं जो प्रत्येक के लिए पारित किया जाता है:
public interface IViewDataFactory
{
T Create<T>()
where T : MasterViewData, new()
}
public class ProductController : Controller
{
public ProductController(IViewDataFactory viewDataFactory)
...
public ActionResult Index()
{
var viewData = viewDataFactory.Create<ProductViewData>();
viewData.Name = "My product";
viewData.Price = 9.95;
return View("Index", viewData);
}
}
वंशानुक्रम संबंध को अच्छी तरह से देखने के लिए मास्टर से मेल खाता है, लेकिन जब यह धारावाहिक / उपयोगकर्ता नियंत्रण प्रदान करने की बात आती है तो मैं उनके दृश्य डेटा को पृष्ठ दृश्य डेटा, जैसे
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
public SubViewData SubViewData { get; set; }
}
<% Html.RenderPartial("Sub", Model.SubViewData); %>
यह केवल उदाहरण कोड है और जैसा कि संकलन करने का इरादा नहीं है। ASP.Net MVC 1.0 के लिए डिज़ाइन किया गया।
मैं गुरुत्व के डेटा-चालित टुकड़ों को विभाजन में तोड़ना और Html.RenderAction का उपयोग करके उन्हें प्रदान करना पसंद करता हूं । यह लोकप्रिय दृश्य मॉडल इनहेरिटेंस दृष्टिकोण पर कई अलग-अलग फायदे हैं:
संपादित करें
जेनेरिक एरर ने नीचे बेहतर उत्तर दिया है। कृपया इसे पढ़ें!
मूल उत्तर
Microsoft ने वास्तव में इसे संभालने के लिए "आधिकारिक" तरीके से एक प्रविष्टि पोस्ट की है । यह उनके तर्क की व्याख्या के साथ एक कदम-दर-चरण चलना प्रदान करता है।
संक्षेप में, वे एक अमूर्त नियंत्रक वर्ग का उपयोग करने की सलाह देते हैं, लेकिन अपने लिए देखें।
मैंने कुछ शोध किया और इन दोनों साइटों पर आया। शायद वे मदद कर सकें।
ASP.NET MVC टिप # 31 - मास्टर पेज और उपयोगकर्ता नियंत्रणों को डेटा पास करना
Request.Params ऑब्जेक्ट उत्परिवर्तनीय है। अनुरोध प्रसंस्करण चक्र के भाग के रूप में इसे स्केलर मान जोड़ना बहुत आसान है। दृश्य के दृष्टिकोण से, वह जानकारी QueryString या FORM POST में प्रदान की जा सकती थी। hth
मुझे लगता है कि एक और अच्छा तरीका कुछ इंटरफ़ेस के साथ देखने के लिए इंटरफ़ेस बनाने के लिए हो सकता है जैसे कुछ इंटरफ़ेस के ParentView, इसलिए आप इसे दोनों नियंत्रणों के लिए उपयोग कर सकते हैं, जो पृष्ठ (पैरेंट कंट्रोल) के संदर्भ के लिए और मास्टर विचारों के लिए जिसे एक्सेस किया जाना चाहिए। देखा गया।
अन्य समाधानों में लालित्य का अभाव है और बहुत लंबा है। मैं लगभग पूरे एक साल बाद यह बहुत दुखद और कमज़ोर चीज़ करने के लिए माफी माँगता हूँ:
<script runat="server" type="text/C#">
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
MasterModel = SiteMasterViewData.Get(this.Context);
}
protected SiteMasterViewData MasterModel;
</script>
तो स्पष्ट रूप से मेरे पास SiteMasterViewData पर यह स्थिर तरीका Get () है जो SiteMasterViewData को लौटाता है।