2012-02-04 4 views
5

मैं भेजे गए टेम्पलेट ईमेल के लिए नीचे दी गई विधि के साथ पार्टिकल व्यू/मॉडल प्रस्तुत कर रहा हूं।कंट्रोलर कॉन्टेक्स्ट और व्यूडाटा कंट्रोलर के दायरे से बाहर - एमवीसी 3 सी #

मैं आंशिक और मॉडल को एक HTML स्ट्रिंग में परिवर्तित करने के लिए नीचे दिए गए कोड का उपयोग कर रहा हूं जिसे मैं अपने ईमेल भेजने कोड में भेज सकता हूं।

public class BaseController : Controller 
{ 
    public string RenderPartialViewToString(string viewName, object model) 
    { 
     if (string.IsNullOrEmpty(viewName)) 
      throw new ArgumentException("No View Path Provided."); 

     ViewData.Model = model; 

     using (StringWriter sw = new StringWriter()) 
     { 
      ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName); 
      ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); 
      viewResult.View.Render(viewContext, sw); 

      return sw.GetStringBuilder().ToString(); 
     } 
    } 
} 

वर्तमान में, यह BaseController में रहता है, मैं एक सहायक विधि में इसे बाहर ले जाने के लिए इतना है कि मैं अपने ईमेल मॉडल इमारत का निर्माण कर/नियंत्रक से बाहर भी भेज रहा है स्थानांतरित कर सकते हैं करना चाहते हैं।

समस्या मैं ViewData/TempData/ControllerContext के लिए उपयोग नहीं है

मैं कर सकते हैं नए ऊपर एक ControllerContext लेकिन मैं ViewData/TempData के बारे में क्या करना है पता नहीं है।

यह मैं कैसे प्रयोग करेंगे क्या मैं नियंत्रक वर्तमान में है:

//Do Stuff in Controller 

var html = RenderPartialViewToString("~/Views/Mail/_ForgotPassword.cshtml", new MailModel { Username = "Skrillex", SomethingElse = "foo" }); 

//Send the Email 
+0

आप को देखने के प्रतिपादन में tempdata/ViewData उपयोग कर रहे हैं ? यदि नहीं तो खाली क्यों नहीं गुजर रहे हैं? – Aliostad

+0

मैं मॉडल सेट करने के लिए व्यूडेटा का उपयोग कर रहा हूं। – Jason

+1

तो यह दृढ़ता से टाइप किए गए दृश्य क्यों नहीं है? क्या आपको ढीले दृश्य का उपयोग करना पड़ा? – Aliostad

उत्तर

2

मुझे लगता है कि आप सही रास्ते पर हैं, लेकिन समस्या यह जुदाई पूरा करने के लिए अपने उत्सुकता है, यह नहीं बल्कि बहुत उत्सुक है।

आप अपने समृद्ध टेक्स्ट HTML ईमेल को प्रस्तुत करने के लिए रेजर व्यू इंजन का उपयोग कर रहे हैं। एक बहुत ही महान दृष्टिकोण। हालांकि, इसका मतलब यह है कि आप अपनी प्रस्तुति परत के बहुत करीब होंगे और इसे नियंत्रक के बाहर से चलाएंगे - मेरे विचार में - बहुत समझ में नहीं आता है।

  • आपका ईमेल उस्तरा दृश्य के रूप में दृढ़ता से टाइप किया
  • सामान्य
  • प्रतिपादन के रूप में नियंत्रक में कहा जाता है प्रतिपादन के रूप में सरल हो जाएगा करते हैं:

    मैं तुम्हें करने के लिए (यदि पहले से ही नहीं बने) की जरूरत का मानना ​​है रेंडर विधि

  • पर मॉडल को पास करने के रूप में अपनी इच्छा के अनुसार अपने ईमेल मॉडल का निर्माण करें। इसके लिए किसी प्रस्तुति परत तर्क की आवश्यकता नहीं होगी और इसके लिए यह अनजान है।

तो बिंदु यह है कि प्रतिपादन के कॉलिंग को नियंत्रक से बाहर जाने की आवश्यकता नहीं है, ईमेल मॉडल का निर्माण करना चाहिए।

अब यदि आप यह सब कर रहे हैं तो इसका मतलब है कि मुझे आपके प्रश्न को समझ में नहीं आया है और मुझे और स्पष्टीकरण की आवश्यकता है।

+0

तो, उदाहरण के लिए, मैं एक मेलकंट्रोलर बनाउंगा जो स्ट्रिंग देता है? और बस RenderToHTML विधि को बेसकंट्रोलर में छोड़ दें या इसे मेलकंट्रोलर तक ले जाएं? फिर खाते/पंजीकरण कार्रवाई में, उदाहरण के लिए, जब मुझे सफलता ईमेल भेजने की आवश्यकता होती है: मेरी रजिस्टर सामग्री करें, मेल मॉडल बनाएं, मेल/रेंडररगीस्टर ईमेल कार्रवाई पर कॉल करें और वह ईमेल प्रेषक को उत्पन्न स्ट्रिंग को पास करें? – Jason

0

आप एक उदाहरण या सहायक कक्षा में BaseController के स्थिर संपत्ति के रूप में नीचे दिखाया गया है बना सकते हैं,

public sealed class Helper { 
///Gets or sets BaseController 
public BaseController { get; set; } 
#region "Constructors" 
/// <summary> 
/// Initialises a new instance of the <see cref="Helper" /> class. 
/// </summary> 
public Helper() : base() { 

} 
/// <summary> 
/// Initialises a new instance of the <see cref="Helper" /> class. 
/// </summary> 
public Helper(BaseController baseController) : this() { 
    this.BaseController = baseController; 
} 
#endregion 
public void SendEmail(){ 
    // Here you can call your RenderPartialViewToString from the BaseController 
var m_RenderPartialViewToString = this.BaseController.RenderPartialViewToString(.......); 
}} 

सादर। उम्मीद है की यह मदद करेगा।

0

मैं उस्तरा ईमेल एक नियंत्रक की ओर से बाहर भेजा करने की आवश्यकता है प्रतिपादन के लिए 2 तरीकों का इस्तेमाल किया है ... पहले मैं ControllerContext मेरी सेवा परत जो उम्मीद के रूप में काम करने के लिए अपनी सेवाओं को पारित कर दिया है, लेकिन आदर्श नहीं .... अक्सर कमांड लाइन ऐप्स द्वारा उपयोग या Windows सेवा है जहाँ कोई ControllerContext उपलब्ध नहीं है ... मेरी दूसरा प्रयास मैं इस रेजर का इस्तेमाल किया प्रस्तुत करना पर में संकलित कर रहे हैं इंजन: http://razorengine.codeplex.com/ या https://github.com/Antaris/RazorEngine

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