दिलचस्प पोस्ट
एक छवि को ggplot2 में डालना मेरे एंड्रॉइड ऐप में पाठ को कैसे प्रतिलिपि करें? एक सादा फ़ंक्शन पॉइंटर में पदोन्नति बढ़ावा :: फ़ंक्शन ऑपरेटिंग सिस्टम जानकारी प्राप्त करें क्या मैं दूसरे वर्ग में किसी गतिविधि का उद्देश्य बना सकता हूं? Mysql_insert_id का उपयोग करने के लिए सुरक्षित है? एक देशी विंडोज़ अनुप्रयोग में संसाधन में एम्बेड पाठ फ़ाइल सी ++ कास्ट सिंटेक्स शैली मैं एक फाइल सूचक (फाइल * एफपी) को एक फ़ाइल डिस्क्रिप्टर (इंट एफडी) में कैसे रूपांतरित कर सकता / सकती हूं? सभी MySQL तालिकाओं से सभी कॉलम प्राप्त करें एंड्रॉइड वेबव्यू में फ़ुलस्क्रीन पर HTML5 वीडियो चला रहा है मैं आईफोन पर ओरिएंटेशन परिवर्तन पर वेब ऐप के पैमाने / ज़ूम कैसे रीसेट करूं? एकाधिक स्ट्रिंग मैचों को खोजने के लिए एल्गोरिथ्म आईफोन ब्राउज़र से स्थानीय होस्ट पर चलने वाली वेबसाइट पर आप कैसे पहुंच सकते हैं जावा को सीरियलजएबल अंतरफलक की आवश्यकता क्यों है?

ASP.NET MVC रेजर पास मॉडल लेआउट के लिए

मैं जो देखता हूं वह स्ट्रिंग लेआउट संपत्ति है I लेकिन मैं स्पष्ट रूप से लेआउट के मॉडल को कैसे पारित कर सकता हूं?

वेब के समाधान से एकत्रित समाधान "ASP.NET MVC रेजर पास मॉडल लेआउट के लिए"

ऐसा लगता है जैसे आपने अपने व्यू-मॉडेल्स को थोड़ा गलत किया है यदि आपको यह समस्या है।

व्यक्तिगत रूप से मैं लेआउट पेज कभी नहीं टाइप होगा लेकिन अगर आप ऐसा करना चाहते हैं, तो आपको एक बेस व्यू मॉोडेल होना चाहिए, जो आपके दूसरे व्यू मॉडेल्स से निकलते हैं और अपना लेआउट बेस व्यू मॉडेल पर टाइप करते हैं और आप विशिष्ट पृष्ठों पर एक बार टाइप करते हैं।

  1. अपने नियंत्रक (या बेस कंट्रोलर) को किसी भी प्रकार के साथ मेन लेआउट व्यू मॉडेल (या जो कुछ भी) का उपयोग करना चाहते हैं, उसे जोड़ें।
  2. अपने नियंत्रक (या बेस नियंत्रक) के निर्माता में, प्रकार का इन्स्तांत करें और इसे संपत्ति पर सेट करें
  3. इसे ViewData फ़ील्ड (या ViewBag) पर सेट करें
  4. लेआउट पृष्ठ में, उस संपत्ति को अपने प्रकार में डालें

उदाहरण: नियंत्रक:

 public class MyController : Controller { public MainLayoutViewModel MainLayoutViewModel { get; set; } public MyController() { this.MainLayoutViewModel = new MainLayoutViewModel();//has property PageTitle this.MainLayoutViewModel.PageTitle = "my title"; this.ViewData["MainLayoutViewModel"] = this.MainLayoutViewModel; } } 

उदाहरण लेआउट पृष्ठ का शीर्ष

 @{ var viewModel = (MainLayoutViewModel)ViewBag.MainLayoutViewModel; } 

अब आप टाइप किए गए ऑब्जेक्ट के पूर्ण एक्सेस के साथ अपने लेआउट पेज में वेरिएबल 'व्यू मॉडेल' का संदर्भ दे सकते हैं।

मुझे यह दृष्टिकोण पसंद है क्योंकि यह नियंत्रक है जो लेआउट को नियंत्रित करता है, जबकि व्यक्तिगत पृष्ठ व्यू-मॉडेल्स लेआउट नास्तिक रहते हैं।

एमवीसी कोर के लिए नोट्स


प्रत्येक एक्शन को पहली बार कॉल करने के लिए MVC कोर ViewData / ViewBag की सामग्री को दूर करने के लिए प्रकट होता है इसका क्या मतलब यह है कि निर्माता में ViewData असाइन करना काम नहीं करता है। काम करता है, हालांकि, एक IActionFilter का उपयोग कर रहा है और IActionFilter में सटीक समान कार्य कर रहा है अपने MyController पर MyActionFilter रखो

 public class MyActionFilter: Attribute, IActionFilter { public void OnActionExecuted(ActionExecutedContext context) { } public void OnActionExecuting(ActionExecutingContext context) { var myController= context.Controller as MyController; if (myController!= null) { myController.Layout = new MainLayoutViewModel { }; myController.ViewBag.MainLayoutViewModel= myController.Layout; } } } 

यह बहुत बुनियादी सामान है, आपको बस एक आधार दृश्य मॉडल बनाना और यह सुनिश्चित करना है कि सभी को करना है! और मैं सभी का मतलब है! आपके विचारों का जो कभी भी उस लेआउट का उपयोग करेगा, उस आधार मॉडल का उपयोग करने वाले विचार प्राप्त होंगे!

 public class SomeViewModel : ViewModelBase { public bool ImNotEmpty = true; } public class EmptyViewModel : ViewModelBase { } public abstract class ViewModelBase { } 

_Layout.cshtml में:

 @model Models.ViewModelBase <!DOCTYPE html> <html> and so on... 

घर नियंत्रक में सूचकांक (उदाहरण के लिए) विधि में:

  public ActionResult Index() { var model = new SomeViewModel() { }; return View(model); } 

Index.cshtml:

 @model Models.SomeViewModel @{ ViewBag.Title = "Title"; Layout = "~/Views/Shared/_Layout.cshtml"; } <div class="row"> 

मैं इससे सहमत नहीं हूं कि _layout को मॉडल पारित करना एक त्रुटि है, कुछ उपयोगकर्ता जानकारी को पारित किया जा सकता है और डेटा को नियंत्रकों की विरासत श्रृंखला में बांटा जा सकता है ताकि केवल एक कार्यान्वयन की आवश्यकता हो।

स्पष्ट रूप से अधिक उन्नत उद्देश्य के लिए आपको इंजेक्शन का उपयोग करके कस्टम स्थिर contaxt बनाने और _Layout.cshtml में उस मॉडल नेमस्पेस को शामिल करना चाहिए।

लेकिन बुनियादी उपयोगकर्ताओं के लिए यह चाल करेंगे

आप न सिर्फ आंशिक दृश्य के लिए आवश्यक मॉडल से गुजरते हुए अपने खुद के विशिष्ट नियंत्रक के साथ एक नया आंशिक दृश्य जोड़ते हैं और अंत में अपने लेआउट.cshtml पर दिए गए आंशिक दृश्य को प्रस्तुत करना RenderPartial या RenderAction का उपयोग करते हैं?

मैं लॉग इन उपयोगकर्ता की जानकारी जैसे नाम, प्रोफ़ाइल चित्र और आदि दिखाने के लिए इस पद्धति का उपयोग करता हूं।

मान लीजिए कि आपके मॉडल ऑब्जेक्ट का एक संग्रह है (या शायद एक ऑब्जेक्ट)। मॉडल में प्रत्येक ऑब्जेक्ट के लिए निम्न कार्य करें

1) उस वस्तु को रखें जिसे आप व्यूबैग में प्रदर्शित करना चाहते हैं। उदाहरण के लिए:

  ViewBag.YourObject = yourObject; 

2) _Layout.cshtml के शीर्ष पर एक प्रयोग कथन जोड़ें जिसमें आपकी ऑब्जेक्ट्स के लिए क्लास परिभाषा शामिल है उदाहरण के लिए:

@ अपने अनुप्रयोग का उपयोग कर.आपके क्लासेस;

3) जब आप अपने ऑब्जेक्ट को _लेआउट में डालें तो इसे डालें। आप (2) में क्या किया था की वजह से आप कलाकारों को लागू कर सकते हैं।

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

 public class MyLayoutModel { public User CurrentUser { get { .. get the current user .. } } } 

तो दृश्य में

 @{ // Or get if from your DI container var myLayoutModel = new MyLayoutModel(); } 

शुद्ध कोर में आप यह भी छोड़ सकते हैं और निर्भरता इंजेक्शन का उपयोग कर सकते हैं।

 @inject My.Namespace.IMyLayoutModel myLayoutModel 

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

पुराने प्रश्न, लेकिन केवल MVC5 डेवलपर्स के लिए समाधान का उल्लेख करने के लिए, आप Model संपत्ति का उपयोग दृश्य के अनुसार कर सकते हैं।

दोनों दृश्य और लेआउट में Model प्रॉपर्टी उसी ViewDataDictionary ऑब्जेक्ट के साथ ViewDataDictionary होती है, इसलिए आपको लेआउट पृष्ठ पर अपने मॉडल को पास करने के लिए कोई अतिरिक्त कार्य करने की आवश्यकता नहीं है, और आपको लेआउट में @model MyModelName घोषित करने की ज़रूरत नहीं है ।

लेकिन ध्यान दें कि जब आप @Model.XXX@Model.XXX का लेआउट में उपयोग करते हैं तो intelliSense संदर्भ मेनू नहीं दिखाई देगा क्योंकि Model यहां एक गतिशील वस्तु है जैसे कि ViewBag

 public interface IContainsMyModel { ViewModel Model { get; } } public class ViewModel : IContainsMyModel { public string MyProperty { set; get; } public ViewModel Model { get { return this; } } } public class Composition : IContainsMyModel { public ViewModel ViewModel { get; set; } } 

अपने लेआउट में IContainsMyModel का उपयोग करें

हल किया। इंटरफेस नियम

उदाहरण के लिए

 @model IList<Model.User> @{ Layout="~/Views/Shared/SiteLayout.cshtml"; } 

नए @ मॉडेल निर्देश के बारे में अधिक पढ़ें