2015-12-03 9 views
14

पर मॉडल पास करने में विफल रहा है जब मैं संपादन टेम्पलेट सदस्य के बिना अपना टेम्पलेट प्रस्तुत करता हूं, यह काम करता है। हालांकि, जब मैं अपने आवेदन के भीतर उस अतिरिक्त सदस्य को जोड़ता हूं तो मुझे अपवाद मिलता है Could not load file or assembly 'Models, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified. मॉडल प्रोजेक्टमोडेल, एडिट हिस्ट्री और उपयोगकर्ता सम्मिलन वाली प्रोजेक्ट है।पृथक RazorEngine अलग-अलग AppDomain

public class ContentModel 
{ 
    public string Html { get; set; } 
    public string Title { get; set; } 
    public EditHistory History { get; set; } 
} 

public class EditHistory 
{ 
    public IReadOnlyCollection<UserDetail> Authors { get; set; } 
} 

public class UserDetail 
{ 
    public string Name { get; set; } 
    public string EmailAddress { get; set; } 
} 

मैं जैसे एक RazorDynamicObject में ContentModel लपेटकर हूँ: Razor.Run("default.cshtml", typeof(ContentModel), RazorDynamicObject.Create(cm));

ऊपर उल्लेख किया है, यह EditHistory मौजूद होने के बिना काम करता है, लेकिन विफल रहता है यह तब होता है जब।

सैंडबॉक्स https://antaris.github.io/RazorEngine/Isolation.html

पर कि यह कैसे हुआ प्रति शब्दशः की स्थापना की है के रूप में मैं यह जटिल कस्टम प्रकार के साथ काम करने के लिए कैसे मिलता है?

एएसपी.नेट के तहत चल रहा है।

संपादित करें मैंने जिस मुद्दे का सामना कर रहा हूं उसका न्यूनतम प्रजनन बनाया है। यह https://github.com/knightmeister/RazorEngineIssue पर है। यदि पैकेज पुनर्स्थापना विफल हो जाती है, मैन्युअल रूप से install-package razorengine

+2

अगर आप की जगह 'सार्वजनिक EditHistory इतिहास क्या होता है {मिल; सेट;}' 'सार्वजनिक IReadOnlyCollection साथ इतिहास {प्राप्त करें; सेट;} 'और एक सामान्य प्रकार के साथ एक ही परीक्षण' सार्वजनिक आईआरएडऑनली कोलेक्शन इतिहास {get; set;} '? क्या केवल पढ़ने का संग्रह समस्या हो सकती है? क्या होगा यदि आपने 'IList' या' IENumerable' का उपयोग किया था? वही परिणाम? – Tommy

+2

कोई भी मौका आप एक साधारण वीएस परियोजना को एक साथ रख सकते हैं जो इस मुद्दे को पुन: उत्पन्न करता है और कहीं प्रकाशित करता है (उदा। गिटहब)? –

+2

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

उत्तर

4

सबसे पहले; मैं कभी भी आपके गिटहब-कोड को चलाने में सक्षम नहीं था। निम्नलिखित मेरे अपने पुनरुत्पादन कोड पर आधारित है।

मुझे लगता है कि आप फ़ाइल या विधानसभा -exceptions लोड नहीं कर सका हो रही है, क्योंकि जब आप सेटअप सैंडबॉक्स AppDomain आप स्थापित कर रहे हैं:

adSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; 

यह ASP.NET में काम नहीं करेगा क्योंकि असेंबली bin उपफोल्डर में हैं। कि ठीक करने के लिए, बस इस के बजाय कार्य करें:

adSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase 
          + "\\bin"; 

हालांकि, ASP.NET होगा डिफ़ॉल्ट shadow copy assemblies द्वारा। इसलिए बस इस बदलाव को करने से शायद एक और अपवाद होगा:

तर्कसंगतता: ऑब्जेक्ट प्रकार को लक्ष्य प्रकार में परिवर्तित नहीं किया जा सकता है।

ऐसा इसलिए है क्योंकि डिफ़ॉल्ट ऐप डोमेन और सैंडबॉक्स में लोड असेंबली के बीच एक मिश्रण है। डिफ़ॉल्ट ऐप डोमेन में से एक अस्थायी छाया प्रतिलिपि स्थान पर स्थित हैं और सैंडबॉक्स में मौजूद हैं आपके वेब एप्लिकेशन रूट के बिन-फ़ोल्डर में स्थित हैं।

इसे ठीक करने के लिए सबसे आसान तरीका अपने Web.config में <system.web> के तहत निम्न पंक्ति जोड़कर छाया नकल निष्क्रिय करने के लिए है:

<hostingEnvironment shadowCopyBinAssemblies="false"/> 

अलावा; मुझे लगता है कि RazorDynamicObject का उपयोग करके छोड़ना बेहतर और आसान है और इसके बजाय अपने मॉडल को [Serializable] के साथ चिह्नित करें। वास्तव में मुझे RazorDynamicObject ठीक से काम नहीं मिला।

इस उत्तर के बाकी को सारांशित क्या मैं इस निष्कर्ष


मुझे लगता है कि यह एक बग या RazorEngine में सीमा की वजह से है में आने के लिए किया था। (मैं अब इस बारे में इतना यकीन नहीं कर रहा हूँ, यह बहुत अच्छी तरह से है कि छाया नकल हो सकता है और RazorDynamicObject एक साथ काम नहीं कर सकता)

मैं कुछ घंटों बिताया है यह पता लगाने की कि यह कैसे काम करने की कोशिश कर लेकिन मैं हमेशा रेजोरइंजिन से फेंकने वाले सुरक्षा अपवाद के साथ समाप्त हुआ हूं।

हालांकि, एक संभावित कार्यवाही है: डुबकी RazorDynamicObject और अपने मॉडल वर्गों को धारावाहिक के रूप में चिह्नित करें।

[Serializable] 
public class ContentModel 
{ 
    public string Html { get; set; } 
    public string Title { get; set; } 
    public EditHistory History { get; set; } 
} 

[Serializable] 
public class EditHistory 
{ 
    public IReadOnlyCollection<UserDetail> Authors { get; set; } 
} 

[Serializable] 
public class UserDetail 
{ 
    public string Name { get; set; } 
    public string EmailAddress { get; set; } 
} 

और कार्य करें:

Razor.Run("default.cshtml", typeof(ContentModel), cm); // no RazorDynamicObject 

मैं अपने रेप्रो कोड चल नहीं मिल सका है, इसलिए मैं अपने कोड के आधार पर अपने खुद के बनाए गए:

  1. एक बनाएं नया कंसोल एप्लिकेशन (विजुअल स्टूडियो)

  2. पैकेज प्रबंधक कंसोल में, चलाएँ: install-package razorengine

  3. कॉपी कोड अपने रेप्रो से:

  4. [Serializable] के साथ मॉडल मॉडल।

  5. RazorDynamicObject

  6. सुनिश्चित करने के लिए है कि हम वास्तव में लेखकों की सूची से उपयोगकर्ता जानकारी प्रदान कर सकते हैं, करने के लिए परीक्षण टेम्पलेट को बदल निकालें:

    string template = "@Model.History.Authors[0].EmailAddress"; 
    
  7. इसके अलावा, उस टेम्पलेट काम करने के लिए, बदलने AuthorsEditHistoryIReadOnlyCollection<> से IReadOnlyList<>

https://gist.github.com/mwikstrom/983c8f61eb10ff1e915a

यह मेरे लिए काम करता है: 1,363,210

मैं जिसके परिणामस्वरूप कोड के साथ एक GIST बनाया। यह [email protected] प्रिंट करता है जैसा कि इसे करना चाहिए।


एएसपी।नेट डिफ़ॉल्ट रूप से कॉपी असेंबली छाया करेगा और इससे सैंडबॉक्सिंग के साथ अतिरिक्त समस्याएं पैदा होंगी।

  1. अपने Web.config फ़ाइल में <system.web> के अंतर्गत निम्नलिखित जोड़कर

    अक्षम ASP.NET छाया नकल:

    ASP.NET के तहत इस काम के आप होगा निम्न परिवर्तन करने के लिए प्राप्त करने के लिए

    <hostingEnvironment shadowCopyBinAssemblies="false"/> 
    
  2. सैंडबॉक्स के एप्लिकेशन बेस पथ में \bin संलग्न करें। createRazorSandbox(...) में ऐसा:

    adSetup.ApplicationBase = 
        AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "\\bin"; 
    

मैं इस परीक्षण किया है और यह सिर्फ ठीक काम करता है। मेरे परीक्षण परियोजना बस है:

  • एक खाली ASP.NET वेब अनुप्रयोग (दृश्य स्टूडियो के साथ बनाया), install-package razorengine साथ

  • Web.config में <hostingEnvironment shadowCopyBinAssemblies="false"/>

  • निम्नलिखित Global.asax.cs:

https://gist.github.com/mwikstrom/ea2b90fd0d306ba3498c


वहाँ अन्य विकल्प (अक्षम करने छाया नकल के अलावा) यहाँ सूचीबद्ध हैं:

https://github.com/Antaris/RazorEngine/issues/224

+0

पैकेज जोड़ने का प्रयास करें, कोशिश करने के लिए धन्यवाद।मैंने पोस्ट करने से पहले ऐसा करने की कोशिश की, और मैंने अभी गिटहब (ओपी देखें) में पोस्ट किए गए उदाहरण के साथ फिर कोशिश की है - क्या आप इसे चलाने में सक्षम थे? – Sam

+0

@ सैम: कृपया मेरा हालिया संपादन देखें जो दिखाता है कि मैंने इसे चलाने के लिए क्या किया। –

+0

आपकी मदद की सराहना करते हैं, लेकिन यह एएसपी.नेट के तहत काम नहीं करता है। इसे एएसपी.नेट के तहत चलाने की जरूरत है। – Sam

1

मैं ज्यादातर डॉन ' टी उपयोग करें जटिल प्रकार लेकिन आम नियम आमतौर पर केवल प्राचीन डेटाटाइप को स्थानांतरित कर दिया जाता है (मेरा अपना नियम, क्योंकि मूल्य अक्सर मेरे लिए खो जाते हैं)। हालांकि, जब कुछ पुराने स्रोत कोड को देखते हुए मैंने देखा कि मैंने कई जटिल प्रकारों का उपयोग किया है, लेकिन मैंने उन्हें नियंत्रक में पॉप्युलेट किया (उदाहरण के लिए पब्लिक एक्शन रिसैट इंडेक्स())। कुछ पढ़ने के बाद मुझे लगता है कि अगर आप इस के लिए कुछ इसी तरह (अपरीक्षित, MSDN source, 2nd source) का उपयोग यह काम हो सकता है:

[MetadataType(typeof(EditHistory))] 
public partial class ContentModel 
{ 
    public string Html { get; set; } 
    public string Title { get; set; } 
    public EditHistory History { get; set; } 
} 

[MetadataType(typeof(UserDetail))] 
public partial class EditHistory 
{ 
    public IReadOnlyCollection<UserDetail> Authors { get; set; } 
} 

public class UserDetail 
{ 
    public string Name { get; set; } 
    public string EmailAddress { get; set; } 
} 
संबंधित मुद्दे