ビューを文字列にレンダリングしてからリダイレクトすることはできません. 2月(バージョン1.0以降だと思います)からのこの回答は可能であると主張しています。私は何か間違ったことをしていると思っていましたが、7月にHaackからのこの回答を読んで、それは不可能だと主張しました.
誰かがそれを機能させ、私がそれを機能させるのを手伝ってくれるなら、それは素晴らしいことです (そして、コードやエラーを投稿します)。しかし、私は今、回避策が必要なところにいます。いくつかありますが、理想的なものはありません。誰かがこれを解決しましたか、それとも私の考えにコメントがありますか?
- これは、電子メールをレンダリングすることです。私は確かにWebリクエストの外で電子メールを送信できますが(データベースに情報を保存して後で取得します)、電子メールには多くの種類があり、テンプレートデータ(ユーザーオブジェクト、他のいくつかのLINQオブジェクト)を保存したくありません) db で後でレンダリングできるようにします。もっとシンプルでシリアル化可能な POCO を作成してデータベースに保存することもできますが、なぜでしょうか? ... レンダリングされたテキストが欲しい!
- ヘッダーが送信されたかどうかを確認する新しい RedirectToAction オブジェクトを作成し (これを行う方法がわかりません -- try/catch?)、送信された場合は、メタ リダイレクト、JavaScript リダイレクトを使用して単純なページを構築します。 、および「ここをクリック」リンクもあります。
- コントローラー内で、メールをレンダリングしたかどうかを記憶できます。レンダリングした場合は、ビューを表示して手動で #2 を実行します。
- 電子メールがレンダリングされる可能性がある前に、リダイレクト ヘッダーを手動で送信できます。次に、MVC インフラストラクチャを使用してアクションにリダイレクトするのではなく、単に result.end を呼び出します。これは最も簡単に思えますが、非常に面倒です。
- 他に何か?
編集:ダンのコードを試しました(すでに試した1月/2月のコードと非常に似ています)が、まだ同じエラーが発生しています。私が見ることができる唯一の実質的な違いは、私が部分ビューを使用しているのに対し、彼の例ではビューを使用していることです。後でこれをビューでテストしてみます。
これが私が持っているものです:
コントローラ
public ActionResult Certifications(string email_intro)
{
//a lot of stuff
ViewData["users"] = users;
if (isPost())
{
//create the viewmodel
var view_model = new ViewModels.Emails.Certifications.Open(userContext)
{
emailIntro = email_intro
};
//i've tried stopping this after just one iteration, in case the problem is due to calling it multiple times
foreach (var user in users)
{
if (user.Email_Address.IsValidEmailAddress())
{
//add more stuff to the view model specific to this user
view_model.user = user;
view_model.certification302Summary.subProcessesOwner = new SubProcess_Certifications(RecordUpdating.Role.Owner, null, null, user.User_ID, repository);
//more here....
//if i comment out the next line, everything works ok
SendEmail(view_model, this.ControllerContext);
}
}
return RedirectToAction("Certifications");
}
return View();
}
メールを送る()
public static void SendEmail(ViewModels.Emails.Certifications.Open model, ControllerContext context)
{
var vd = context.Controller.ViewData;
vd["model"] = model;
var renderer = new CustomRenderers();
//i fixed an error in your code here
var text = renderer.RenderViewToString3(context, "~/Views/Emails/Certifications/Open.ascx", "", vd, null);
var a = text;
}
カスタムレンダラー
public class CustomRenderers
{
public virtual string RenderViewToString3(ControllerContext controllerContext, string viewPath, string masterPath, ViewDataDictionary viewData, TempDataDictionary tempData)
{
//copy/paste of dan's code
}
}
エラー
[HttpException (0x80004005): Cannot redirect after HTTP headers have been sent.]
System.Web.HttpResponse.Redirect(String url, Boolean endResponse) +8707691
ありがとう、ジェームズ