एएसपी.नेट एमवीसी


48

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

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


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

  0

कुछ के साथ अपने साझा विचारों शुरू करने की आवश्यकता आभासी पथ प्रदाता का उपयोग कर करता है अभी भी mvc.net में मार्ग के साथ काम? 24 oct. 082008-10-24 11:35:48

  0

@jmcd: ऐसा लगता है कि ऐसा करता है। 25 may. 092009-05-25 13:33:49

  0

क्या कोई नमूना कोड है जिसे आप पोस्ट कर सकते हैं जिसने आपको इसे पूरा करने की अनुमति दी है? 11 jan. 102010-01-11 20:52:22

  0

जिस प्रोजेक्ट पर मैंने कोशिश की थी, वह डिलीच किया गया था, इसलिए मेरे पास तैयार होने पर उदाहरण कोड नहीं है। हालांकि, स्पार्क व्यू इंजन इसे भी अनुमति देता है (http://www.sparkviewengine.com)। मॉड्यूल नामक एक नमूना है जिसे मैं सोचता हूं, जो विभिन्न असेंबली में क्षेत्रों को अलग करता है। 11 jan. 102010-01-11 22:56:09

15

अनिवार्य रूप से यह वही समस्या है क्योंकि लोगों के पास वेबफॉर्म के साथ था और उनकी उपयोगकर्ता नियंत्रण एएससीएक्स फ़ाइलों को एक डीएलएल में संकलित करने की कोशिश कर रहा था। मुझे यह http://www.codeproject.com/KB/aspnet/ASP2UserControlLibrary.aspx मिला जो आपके लिए भी काम कर सकता है।


12
protected void Application_Start() 
{ 
    WebFormViewEngine engine = new WebFormViewEngine(); 

    engine.ViewLocationFormats = new[] { "~/bin/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx" }; 
    engine.PartialViewLocationFormats = engine.ViewLocationFormats; 

    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(engine); 

    RegisterRoutes(RouteTable.Routes); 
} 

तय करें 'उत्पादन को कॉपी' 'हमेशा कॉपी'

  0

WebFormviewEngine बनाने के बजाय आप RazorViewEngine को इस तरह प्राप्त करके ऐसा कर सकते हैं: RazorViewEngine इंजन = ViewEngines.Engines.OfType <RazorViewEngine>()। पहले(); और उसके बाद उल्लिखित गुणों के अतिरिक्त पथ को बस संगत करें। 30 nov. 142014-11-30 15:52:39


2

तुम सब जो अभी भी होली ग्रेल के लिए देख रहे हैं में नया करने के लिए अपने दृश्य की संपत्ति: मैं पाने के लिए थोड़ा और करीब आ गए यह, यदि आप webforms viewengine से बहुत जुड़े नहीं हैं।

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


29

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

Application_Start की प्रथम पंक्ति:

HostingEnvironment.RegisterVirtualPathProvider(new EmbeddedViewPathProvider()); 

VirtualPathProvider

public class EmbeddedVirtualFile : VirtualFile 
{ 
    public EmbeddedVirtualFile(string virtualPath) 
     : base(virtualPath) 
    { 
    } 

    internal static string GetResourceName(string virtualPath) 
    { 
     if (!virtualPath.Contains("/Views/")) 
     { 
      return null; 
     } 



     var resourcename = virtualPath 
      .Substring(virtualPath.IndexOf("Views/")) 
      .Replace("Views/", "OrangeGuava.Common.Views.") 
      .Replace("/", "."); 

     return resourcename; 

    } 


    public override Stream Open() 
    { 
     Assembly assembly = Assembly.GetExecutingAssembly(); 


     var resourcename = GetResourceName(this.VirtualPath); 
     return assembly.GetManifestResourceStream(resourcename); 
    } 




} 

public class EmbeddedViewPathProvider : VirtualPathProvider 
{ 


    private bool ResourceFileExists(string virtualPath) 
    { 

     Assembly assembly = Assembly.GetExecutingAssembly(); 


     var resourcename = EmbeddedVirtualFile.GetResourceName(virtualPath); 
     var result = resourcename != null && assembly.GetManifestResourceNames().Contains(resourcename); 
     return result; 
    } 

    public override bool FileExists(string virtualPath) 
    { 
     return base.FileExists(virtualPath) || ResourceFileExists(virtualPath); 
    } 


    public override VirtualFile GetFile(string virtualPath) 
    { 

     if (!base.FileExists(virtualPath)) 
     { 
      return new EmbeddedVirtualFile(virtualPath); 
     } 
     else 
     { 
      return base.GetFile(virtualPath); 
     } 

    } 

} 

अंतिम चरण यह काम कर रहा करने के लिए है कि जड़ Web.Config पार्स करने के लिए दृढ़ता से टाइप किया MVC सही सेटिंग्स शामिल होना चाहिए विचार, क्योंकि दृश्य फ़ोल्डर में से एक का उपयोग नहीं किया जाएगा:

<pages 
    validateRequest="false" 
    pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" 
    pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" 
    userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
    <controls> 
    <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" /> 
    </controls> 
</pages> 

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

public override VirtualDirectory GetDirectory(string virtualDir) 
    { 
     Log.LogInfo("GetDirectory - " + virtualDir); 
     var b = base.GetDirectory(virtualDir); 
     return new EmbeddedVirtualDirectory(virtualDir, b); 
    } 

public class EmbeddedVirtualDirectory : VirtualDirectory 
{ 
    private VirtualDirectory FileDir { get; set; } 

    public EmbeddedVirtualDirectory(string virtualPath, VirtualDirectory filedir) 
     : base(virtualPath) 
    { 
     FileDir = filedir; 
    } 

    public override System.Collections.IEnumerable Children 
    { 
     get { return FileDir.Children; } 
    } 

    public override System.Collections.IEnumerable Directories 
    { 
     get { return FileDir.Directories; } 
    } 

    public override System.Collections.IEnumerable Files 
    { 
     get { 

      if (!VirtualPath.Contains("/Views/") || VirtualPath.EndsWith("/Views/")) 
      { 
       return FileDir.Files; 
      } 

      var fl = new List<VirtualFile>(); 

      foreach (VirtualFile f in FileDir.Files) 
      { 
       fl.Add(f); 
      } 


      var resourcename = VirtualPath.Substring(VirtualPath.IndexOf("Views/")) 
.Replace("Views/", "OrangeGuava.Common.Views.") 
.Replace("/", "."); 

      Assembly assembly = Assembly.GetExecutingAssembly(); 

      var rfl = assembly.GetManifestResourceNames() 
       .Where(s => s.StartsWith(resourcename)) 
       .Select(s => VirtualPath + s.Replace(resourcename, "")) 
       .Select(s => new EmbeddedVirtualFile(s)); 
      fl.AddRange(rfl); 

      return fl; 
     } 
    } 
} 

अंत में, दृढ़ता से टाइप किया विचारों लगभग नहीं बल्कि काफी पूरी तरह से काम करेंगे।मॉडल एक untyped वस्तु के रूप में माना जाएगा, इतना मजबूत टाइपिंग वापस पाने के लिए आप की तरह

<% var Model2 = Model as IEnumerable<AppModel>; %> 
+2

दृश्य के लिए "एंबेडेड संसाधन" में बिल्ड एक्शन सेट करना याद रखना भी महत्वपूर्ण है। दृश्य के लिए फ़ोल्डर वेब प्रोजेक्ट में भी मौजूद होना चाहिए। मेरे मामले में, मैंने असेंबली प्रोजेक्ट के फ़ोल्डर दृश्य/साझा/गतिशील.cshtml में दृश्य डाला है और असेंबली का संदर्भ देने वाले वेब प्रोजेक्ट में दृश्य/साझा करना है। 04 sep. 132013-09-04 06:38:30