سؤال

وأنا تطوير تطبيق ASP.NET MVC التي سوف ترسل للمستخدم رسالة تأكيد بالبريد الإلكتروني. للالبريد الإلكتروني نفسه، أود أن إنشاء طريقة عرض ثم تقديم هذا الرأي وإرسالها باستخدام الكائنات الإلكتروني .NET.

وكيف يمكنني القيام بذلك باستخدام إطار MVC؟

هل كانت مفيدة؟

المحلول 2

وكما في تعليقي على الجواب ريتشارد، لم هذا الرمز العمل، ولكنه أدى دائما في 'لا يمكن إعادة توجيه بعد إرسال رؤوس HTTP' خطأ.

وبعد <م> الكثير حفر حول جوجل وشعور بالاحباط، وأخيرا وجدت بعض التعليمات البرمجية التي يبدو أن تفعل خدعة، على هذه المادة:

HTTP: //mikehadlow.blogspot كوم / 2008/06 / MVC-إطار التقاط والمخرجات من بين view_05.html

وطريقة هذا الرجل هو خلق له HttpContext الخاصة.

<اقتباس فقرة>   

وبدلا من استخدام MVCContrib BlockRenderer أنا ببساطة استبدال التيار HttpContext مع واحدة جديدة الذي يستضيف استجابة يكتب لStringWriter.

وهذا الأسلوب يعمل تماما (اختلاف بسيط هو أنه كان على خلق عمل منفصلة لتقديم وجهة نظري جزئي، ولكن لا دراما هناك).

نصائح أخرى

وتحتاج أساسا إلى استخدام IView.Render. يمكنك الحصول على عرض باستخدام ViewEngineCollection.FindView (ViewEngines.Engines.FindView لالتخلف). تقديم الإخراج إلى TextWriter وتأكد استدعاء ViewEngine.ReleaseView بعد ذلك. نموذج التعليمات البرمجية أدناه (مجربة):

StringWriter output = new StringWriter();

string viewName = "Email";
string masterName = "";

ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, viewName, masterName);

ViewContext viewContext = new ViewContext(ControllerContext, result.View, viewData, tempData);
result.View.Render(viewContext, output);

result.ViewEngine.ReleaseView(ControllerContext, result.View);

string viewOutput = output.ToString();

وسأترك viewData / tempData لك.

وهذا عمل بالنسبة لي:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;

namespace Profiteer.WebUI.Controllers
{
    public class SampleController : Controller
    {
        public ActionResult Index()
        {
            RenderViewAsHtml(RouteData.Values["controller"].ToString(), 
                             RouteData.Values["action"].ToString());
            return View();
        }

        private void RenderViewAsHtml(string controllerName, string viewName)
        {
            var vEngine = (from ve in ViewEngineCollection
                           where ve.GetType() == typeof(RazorViewEngine)
                           select ve).FirstOrDefault();
            if (vEngine != null)
            {
                var view = 
                    vEngine.FindView(
                        ControllerContext, 
                        viewName, "_Layout", false).View as RazorView;
                if (view != null)
                {
                    var outPath = 
                       Server.MapPath(
                          string.Format("~/Views/{0}/{1}.html", 
                                        controllerName, viewName));
                    using (var sw = new StreamWriter(outPath, false))
                    {
                        var viewContext = 
                            new ViewContext(ControllerContext, 
                                            view, 
                                            new ViewDataDictionary(), 
                                            new TempDataDictionary(), 
                                            sw);
                        view.Render(viewContext, sw);
                    }
                }
            }
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top