私は確認メールをユーザーに送信するASP.NET MVCアプリケーションを開発しています。電子メール自体については、ビューを作成してそのビューをレンダリングし、.NETメールオブジェクトを使用して送信したいと考えています。オンザフライでビューをレンダリングする
どのようにMVCフレームワークを使用してこれを行うことができますか?
私は確認メールをユーザーに送信するASP.NET MVCアプリケーションを開発しています。電子メール自体については、ビューを作成してそのビューをレンダリングし、.NETメールオブジェクトを使用して送信したいと考えています。オンザフライでビューをレンダリングする
どのようにMVCフレームワークを使用してこれを行うことができますか?
リチャードの答えについて、このコードはうまくいきましたが、常に「HTTPヘッダーが送信された後にリダイレクトできません」というエラーが発生しました。
http://mikehadlow.blogspot.com/2008/06/mvc-framework-capturing-output-of-view_05.html
この男の方法は、自分自身を作成することです:
は、Googleの周りを掘りとイライラしているの多くした後、私は最終的に、この記事で、トリックを行うように見えるいくつかのコードを見つけましたHttpContext。
Rather than use the MVCContrib BlockRenderer I simply replace the current HttpContext with a new one that hosts a Response that writes to a 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をあなたに任せます。
このメソッドは、「HTTPヘッダーが送信された後はリダイレクトできません」という点を除いて、一部の変更の後に機能しました。これは、独自のストリームではなく、共有されたResponseオブジェクトの下でHTTPヘッダーを送信することと関係がある(申し訳ありませんが、.NET HTTPオブジェクトについての私の理解はそれだけではありません)。 – Jonathan
なぜリダイレクトするのですか? –
実際にReleaseViewは何をしていますか?それは本当に重要ですか?もし私がそれを呼ぶことがないなら、どうしますか? – NightElfik
これが私の仕事:
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);
}
}
}
}
}
}
を、私はあなたがMVC、ないMCV –
は私が2行にタイプミスと同じ単語の両方を獲得したと信じていないことを意味だと思います! – Jonathan