Saya ingin menampilkan dua tampilan berbeda (satu sebagai string yang akan dikirim sebagai email), dan yang lainnya halaman ditampilkan kepada pengguna.
Apakah ini mungkin dalam ASP.NET MVC beta?
Saya sudah mencoba beberapa contoh:
1. RenderPartial to String di ASP.NET MVC Beta
Jika saya menggunakan contoh ini, saya menerima "Tidak dapat mengarahkan ulang setelah tajuk HTTP dikirim."
2. Kerangka MVC: Menangkap output dari tampilan
Jika saya menggunakan ini, saya tampaknya tidak dapat melakukan redirectToAction, karena mencoba membuat tampilan yang mungkin tidak ada. Jika saya mengembalikan tampilan, itu benar-benar kacau dan tidak terlihat benar sama sekali.
Adakah yang punya ide / solusi untuk masalah ini yang saya miliki, atau punya saran untuk yang lebih baik?
Terimakasih banyak!
Di bawah ini adalah contohnya. Apa yang saya coba lakukan adalah membuat metode 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);
}
Jawaban yang diterima dari Tim Scott (diubah dan diformat sedikit oleh saya):
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;
}
}
Contoh penggunaan
Dengan asumsi panggilan dari pengontrol untuk mendapatkan email konfirmasi pesanan, melewati lokasi Site.Master.
string myString = RenderViewToString(this.ControllerContext, "~/Views/Order/OrderResultEmail.aspx", "~/Views/Shared/Site.Master", this.ViewData, this.TempData);
sumber
Jawaban:
Inilah yang saya buat, dan itu berhasil untuk saya. Saya menambahkan metode berikut ke kelas basis pengontrol saya. (Anda selalu dapat membuat metode statis ini di tempat lain yang menerima controller sebagai parameter saya kira)
MVC2 gaya .ascx
Pisau cukur .cshtml style
Edit: menambahkan kode Razor.
sumber
Jawaban ini tidak dalam perjalanan saya. Ini awalnya dari https://stackoverflow.com/a/2759898/2318354 tetapi di sini saya telah menunjukkan cara untuk menggunakannya dengan Kata Kunci "Statis" untuk menjadikannya umum bagi semua Pengontrol.
Untuk itu Anda harus membuat
static
file kelas di kelas. (Misalkan Nama File Kelas Anda adalah Utils.cs)Contoh ini adalah Untuk Pisau Cukur.
Utils.cs
Sekarang Anda dapat memanggil kelas ini dari controller Anda dengan menambahkan NameSpace di File Controller Anda sebagai cara berikut dengan meneruskan "this" sebagai parameter ke Controller.
Seperti saran yang diberikan oleh @Sergey, metode ekstensi ini juga dapat memanggil dari cotroller seperti yang diberikan di bawah ini
Saya harap ini akan berguna untuk Anda membuat kode bersih dan rapi.
sumber
Ini bekerja untuk saya:
sumber
Saya menemukan solusi baru yang membuat tampilan menjadi string tanpa harus mengacaukan aliran Respon dari HttpContext saat ini (yang tidak memungkinkan Anda untuk mengubah ContentType atau header lainnya dari respons).
Pada dasarnya, semua yang Anda lakukan adalah membuat HttpContext palsu agar tampilan dapat dirender sendiri:
Ini berfungsi pada ASP.NET MVC 1.0, bersama dengan ContentResult, JsonResult, dll. (Mengubah Header pada HttpResponse asli tidak membuang " Server tidak dapat mengatur tipe konten setelah header HTTP telah dikirim " pengecualian).
Pembaruan: di ASP.NET MVC 2.0 RC, kode sedikit berubah karena kita harus meneruskan yang
StringWriter
digunakan untuk menulis tampilan keViewContext
:sumber
StringWriter
Anda gunakan untuk menulisStringBuilder
, bukan contoh baru atau output tampilan akan hilang.Artikel ini menjelaskan cara merender tampilan ke string dalam skenario yang berbeda:
Solusi / kode disediakan sebagai kelas yang disebut ViewRenderer . Ini adalah bagian dari WestwindToolkit milik Rick Stahl di GitHub .
Penggunaan (3. - Contoh WebAPI):
sumber
Jika Anda ingin melupakan MVC sepenuhnya, maka hindari semua kekacauan HttpContext ...
Ini menggunakan Mesin Silet open source yang mengagumkan di sini: https://github.com/Antaris/RazorEngine
sumber
CompilerErrors
properti pengecualian.Anda mendapatkan tampilan dalam string menggunakan cara ini
Kami memanggil metode ini dalam dua cara
ATAU
sumber
Kiat tambahan untuk ASP NET CORE:
Antarmuka:
Penerapan:
Pendaftaran di
Startup.cs
Dan penggunaan dalam controller:
sumber
Saya menggunakan MVC 1.0 RTM dan tidak ada solusi di atas yang berfungsi untuk saya. Tapi yang ini:
sumber
Saya melihat implementasi untuk MVC 3 dan Razor dari situs web lain, itu berhasil untuk saya:
Lebih lanjut tentang Razor render- MVC3 View Render to String
sumber
Untuk membuat tampilan ke string di Lapisan Layanan tanpa harus melewati ControllerContext sekitar, ada artikel Rick Strahl yang baik di sini http://www.codemag.com/Article/1312081 yang membuat pengendali generik. Ringkasan kode di bawah ini:
Lalu untuk menyajikan Tampilan di kelas Layanan:
sumber
Kiat cepat
Untuk Model yang diketik dengan kuat, tambahkan saja ke properti ViewData.Model sebelum meneruskan ke RenderViewToString. misalnya
sumber
Untuk mengulang dari pertanyaan yang lebih tidak dikenal, lihat MvcIntegrationTestFramework .
Itu membuat Anda tidak menulis pembantu sendiri untuk mengalirkan hasil dan terbukti bekerja cukup baik. Saya menganggap ini akan menjadi proyek uji dan sebagai bonus Anda akan memiliki kemampuan pengujian lainnya setelah Anda mendapatkan pengaturan ini. Gangguan utama mungkin akan memilah-milah rantai ketergantungan.
sumber
Berikut adalah kelas yang saya tulis untuk melakukan ini untuk ASP.NETCore RC2. Saya menggunakannya sehingga saya bisa menghasilkan email html menggunakan Razor.
sumber
Saya menemukan cara yang lebih baik untuk membuat halaman tampilan pisau cukur ketika saya mendapatkan kesalahan dengan metode di atas, solusi ini untuk lingkungan bentuk web dan lingkungan mvc. Tidak diperlukan pengontrol.
Berikut adalah contoh kode, dalam contoh ini saya mensimulasikan tindakan mvc dengan async http handler:
sumber