2012-06-26 16 views
7

के दो दृश्य हैं, से बना एक ही लेआउट का उपयोग पर विचार करते हैं:Asp.Net MVC लेआउट और आंशिक दृश्य

  • एक बाएँ कॉलम एक "शरीर" (जो अलग ढंग से दोनों विचारों द्वारा भरा जाता है)
  • एक युक्त सही कॉलम जो सामान्य जानकारी (मॉडल के माध्यम से पारित) प्रदर्शित करता है

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

समस्या यह है कि आंशिक दृश्य implicitely दृश्य है कि प्रदान की जाने से उनके मॉडल के वारिस है। और चूंकि प्रत्येक दृश्य का अपना मॉडल होता है, इसलिए मैं आंशिक दृश्य में मॉडल प्रकार के मिलान के साथ समाप्त होता हूं। मैं ViewBag में दृश्य मॉडल के आम हिस्सा डाल सकता है

  • :

    यहाँ से मैं दो समाधान देखते हैं। दुर्भाग्य से इसका मतलब है प्रत्येक दृश्य के इस लेआउट का उपयोग करता है कि यह "सम्मेलन" लागू करने के लिए है कि लेकिन कुछ भी संकलन समय पर इसके बारे में डेवलपर ने चेतावनी दी है ...

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

    • I Am सही ऊपर मान्यताओं के साथ:

    तो यहाँ सवाल कर रहे हैं?

  • आप किसी भी अन्य संभावना देखते हैं?
  • इस पर अनुभव पर कोई वापसी?

बहुत बहुत धन्यवाद, टीबी।

+0

सर्का 2017, आप आम मॉडल को प्रत्येक मॉडल की एक संपत्ति भी बना सकते हैं, और उसके बाद मॉडल को @ @ एचटीएमएल.रेन्डरपार्टियल ' – jpaugh

उत्तर

7

एक Interface और दो मॉडल पर इसे लागू प्रयोग करें, यह वास्तव में बात यह है कि वे के लिए इस्तेमाल कर रहे हैं की तरह है।

यहाँ है कि दोनों एक इंटरफ़ेस को लागू दो अलग अलग मॉडल का उपयोग कर दो अलग-अलग दृश्य का एक उदाहरण है। यह subtyping बजाय ad-hoc polymorphism है।

public class ViewModelOne : IReusableView 
{ 
    public string Name { get; set; } 
    public string Something { get; set; } 
    public int ANumber { get; set; } 
} 

public class ViewModelTwo : IReusableView 
{ 
    public string Name { get; set; } 
    public string Thing { get; set; } 
    public string SomethingElse { get; set; } 
    public int ANumber2 { get; set; } 
} 

public interface IReusableView 
{ 
    string Name { get; } 
} 

तो हम यहां बहुत आसान आंशिक दृश्य वह यह है कि 'InnerPartialView' है:

@model TestIntegration.Models.IReusableView 
<div> 
    @Model.Name 
</div> 

कौन सा घर में और इस उदाहरण नियंत्रक के उन पृष्ठों का प्रयोग किया जाता है:

public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      ViewBag.Message = "Welcome to ASP.NET MVC!"; 

      return View(new ViewModelOne() { Name = "hello", Something="sdfsdfs", ANumber = 1 }); 
     } 

     public ActionResult About() 
     { 
      return View(new ViewModelTwo() { Name = "hello 2", SomethingElse = "aaaddd", ANumber2 = 10, Thing="rand" }); 
     } 
    } 

घर दृश्य:

@model TestIntegration.Models.ViewModelOne 
@{ 
    ViewBag.Title = "Home Page"; 
} 

<h2>@ViewBag.Message</h2> 
<p> 
    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>. 
    @Html.Partial("InnerPartialView") 
</p> 

के बारे में दृश्य:

@Html.RenderPartial(MVC.Partials.Views.Sidebar, Model.SideBarModel); 

तो तुम माता पिता मॉडल के भाग के लिए मॉडल है कि के रूप में डेटा नीचे भेज सकता है:

@model TestIntegration.Models.ViewModelTwo 
@{ 
    ViewBag.Title = "About Us"; 
} 

<h2>About</h2> 
<p> 
    Put content here. 
     @Html.Partial("InnerPartialView") 
</p> 
+0

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

+0

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

+0

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

3

जब आप आंशिक दृश्य प्रस्तुत करना, आप इसे एक मॉडल भेज सकते हैं आंशिक साइडबार।

+0

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

0

आंशिक विचारों में, मॉडल dynamic टाइप हैं, इसलिए आपको यह जानने की आवश्यकता नहीं है कि वे किस प्रकार हैं। हालांकि, आपको बस यह सुनिश्चित करने की ज़रूरत है कि मॉडल में आपकी आवश्यक संपत्ति हो। दूसरे शब्दों में आप Model.MyProperty या Model.MyPropertyMyPropertyType के रूप में Html.Partial का उपयोग करते समय उपयोग कर सकते हैं।

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