[解決済み] ASP.NET MVCのビューを文字列としてレンダリングする方法は?
2022-03-19 05:58:44
質問
2つの異なるビュー(1つはメールとして送信される文字列)を出力し、もう1つはユーザーに表示されるページを出力したいのです。
ASP.NET MVCベータ版でこれは可能ですか?
複数の例を試してみました。
1.
ASP.NET MVCベータ版でRenderPartialをStringに変換する。
この例を使用すると、"Cannot redirect after HTTP ヘッダが送信されました。
これを使うと、redirectToActionができないようです。 は、存在しないかもしれないビューをレンダリングしようとします。ビューを返した場合、それは は完全に混乱し、全く正しく見えません。
どなたか、私のこれらの問題に対するアイデアや解決策、またはより良いものの提案をお持ちの方はいらっしゃいませんか?
ありがとうございます。
以下はその例です。私が行おうとしているのは GetViewForEmail メソッド :
public ActionResult OrderResult(string ref)
{
//Get the order
Order order = OrderService.GetOrder(ref);
//The email helper would do the meat and veg by getting the view as a string
//Pass the control name (OrderResultEmail) and the model (order)
string emailView = GetViewForEmail("OrderResultEmail", order);
//Email the order out
EmailHelper(order, emailView);
return View("OrderResult", order);
}
Tim Scott氏からの回答(私が少し変更・整形したもの)。
public virtual string RenderViewToString(
ControllerContext controllerContext,
string viewPath,
string masterPath,
ViewDataDictionary viewData,
TempDataDictionary tempData)
{
Stream filter = null;
ViewPage viewPage = new ViewPage();
//Right, create our view
viewPage.ViewContext = new ViewContext(controllerContext, new WebFormView(viewPath, masterPath), viewData, tempData);
//Get the response context, flush it and get the response filter.
var response = viewPage.ViewContext.HttpContext.Response;
response.Flush();
var oldFilter = response.Filter;
try
{
//Put a new filter into the response
filter = new MemoryStream();
response.Filter = filter;
//Now render the view into the memorystream and flush the response
viewPage.ViewContext.View.Render(viewPage.ViewContext, viewPage.ViewContext.HttpContext.Response.Output);
response.Flush();
//Now read the rendered view.
filter.Position = 0;
var reader = new StreamReader(filter, response.ContentEncoding);
return reader.ReadToEnd();
}
finally
{
//Clean up.
if (filter != null)
{
filter.Dispose();
}
//Now replace the response filter
response.Filter = oldFilter;
}
}
使用例
注文確認メールを取得するためのコントローラからの呼び出しを想定し、Site.Masterのロケーションを渡します。
string myString = RenderViewToString(this.ControllerContext, "~/Views/Order/OrderResultEmail.aspx", "~/Views/Shared/Site.Master", this.ViewData, this.TempData);
解決方法は?
以下は、私が思いついたもので、私の場合はうまくいっています。以下のメソッドをコントローラの基底クラスに追加しました。(これらの静的メソッドは、コントローラをパラメータとして受け取る他の場所にいつでも作ることができると思います)
MVC2 .ascxのスタイル
protected string RenderViewToString<T>(string viewPath, T model) {
ViewData.Model = model;
using (var writer = new StringWriter()) {
var view = new WebFormView(ControllerContext, viewPath);
var vdd = new ViewDataDictionary<T>(model);
var viewCxt = new ViewContext(ControllerContext, view, vdd,
new TempDataDictionary(), writer);
viewCxt.View.Render(viewCxt, writer);
return writer.ToString();
}
}
Razor .cshtml スタイル
public string RenderRazorViewToString(string viewName, object model)
{
ViewData.Model = model;
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext,
viewName);
var viewContext = new ViewContext(ControllerContext, viewResult.View,
ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
return sw.GetStringBuilder().ToString();
}
}
編集:Razorのコードを追加しました。
関連
-
[解決済み] ファイルアップロード ASP.NET MVC 3.0
-
[解決済み] ASP.NET MVC Frameworkで複数のサブミットボタンを処理する方法は?
-
[解決済み] ASP.NET MVCでenumからドロップダウンリストを作成するにはどうすればよいですか?
-
[解決済み] MVCで、文字列の結果を返すにはどうしたらいいですか?
-
[解決済み] ASP.NET MVC - カスタムIIdentityまたはIPrincipalの設定
-
[解決済み] ASP.NET MVCでビューをコンパイルする
-
[解決済み] ELMAHをASP.NET MVCの[HandleError]属性で動作させる方法は?
-
[解決済み] ASP.Net MVCのmodelStateからすべてのエラーを取得する方法は?
-
[解決済み】ASP.NET MVCのルートをサブドメインに基づいて作成することは可能ですか?
-
[解決済み] asp.net mvc: なぜ Html.CheckBox は追加の隠された入力を生成するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Automapperにタイプマップの設定がない、またはマッピングがサポートされていない - エラー
-
[解決済み] Kendo UI MVC用パスワードテキストボックス
-
[解決済み] Visual Studioのデバッグ/ロードが非常に遅い
-
[解決済み] ASP.NET MVCにおけるApiControllerとControllerの相違点
-
[解決済み] ASP.NET MVCでHTML-5のdata-*属性でダッシュを使用する方法
-
[解決済み】ASP.NET MVC 3 razor ViewStart ファイルで異なるレイアウトを指定するには?
-
[解決済み】MVCアプリケーションでデータをキャッシュする方法
-
[解決済み】cshtmlテンプレートで関数を作成する方法は?
-
[解決済み] ASP.NET MVCにおけるセッション変数
-
[解決済み] ASP.NET MVCとIIS7で生のHTTPリクエスト/レスポンスをログに記録する