सबसे पहले; मैं कभी भी आपके गिटहब-कोड को चलाने में सक्षम नहीं था। निम्नलिखित मेरे अपने पुनरुत्पादन कोड पर आधारित है।
मुझे लगता है कि आप फ़ाइल या विधानसभा -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
मैं अपने रेप्रो कोड चल नहीं मिल सका है, इसलिए मैं अपने कोड के आधार पर अपने खुद के बनाए गए:
एक बनाएं नया कंसोल एप्लिकेशन (विजुअल स्टूडियो)
पैकेज प्रबंधक कंसोल में, चलाएँ: install-package razorengine
कॉपी कोड अपने रेप्रो से:
[Serializable]
के साथ मॉडल मॉडल।
RazorDynamicObject
सुनिश्चित करने के लिए है कि हम वास्तव में लेखकों की सूची से उपयोगकर्ता जानकारी प्रदान कर सकते हैं, करने के लिए परीक्षण टेम्पलेट को बदल निकालें:
string template = "@Model.History.Authors[0].EmailAddress";
इसके अलावा, उस टेम्पलेट काम करने के लिए, बदलने Authors
EditHistory
IReadOnlyCollection<>
से IReadOnlyList<>
https://gist.github.com/mwikstrom/983c8f61eb10ff1e915a
यह मेरे लिए काम करता है: 1,363,210
मैं जिसके परिणामस्वरूप कोड के साथ एक GIST बनाया। यह [email protected]
प्रिंट करता है जैसा कि इसे करना चाहिए।
एएसपी।नेट डिफ़ॉल्ट रूप से कॉपी असेंबली छाया करेगा और इससे सैंडबॉक्सिंग के साथ अतिरिक्त समस्याएं पैदा होंगी।
- अपने Web.config फ़ाइल में
<system.web>
के अंतर्गत निम्नलिखित जोड़कर अक्षम ASP.NET छाया नकल:
ASP.NET के तहत इस काम के आप होगा निम्न परिवर्तन करने के लिए प्राप्त करने के लिए
<hostingEnvironment shadowCopyBinAssemblies="false"/>
सैंडबॉक्स के एप्लिकेशन बेस पथ में \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
अगर आप की जगह 'सार्वजनिक EditHistory इतिहास क्या होता है {मिल; सेट;}' 'सार्वजनिक IReadOnlyCollection साथ इतिहास {प्राप्त करें; सेट;} 'और एक सामान्य प्रकार के साथ एक ही परीक्षण' सार्वजनिक आईआरएडऑनली कोलेक्शन इतिहास {get; set;} '? क्या केवल पढ़ने का संग्रह समस्या हो सकती है? क्या होगा यदि आपने 'IList' या' IENumerable' का उपयोग किया था? वही परिणाम? –
Tommy
कोई भी मौका आप एक साधारण वीएस परियोजना को एक साथ रख सकते हैं जो इस मुद्दे को पुन: उत्पन्न करता है और कहीं प्रकाशित करता है (उदा। गिटहब)? –
@CaioProiete - अच्छा विचार। मुझे एहसास नहीं है कि बहुत से लोग इस विशेष मॉड्यूल से परिचित होने जा रहे हैं। मैं नहीं हूं, लेकिन वास्तव में विफलता का कारण बनने के लिए उत्सुक हूं (नेस्टेड जटिल प्रकार, केवल पढ़ने के संग्रह, आदि) – Tommy