Cara menghasilkan HTML dari tampilan parsial tertentu pada mesin tampilan ASP.NET diketahui .
Namun jika fungsi ini digunakan pada tampilan sebagian pisau cukur, fungsi tersebut tidak berfungsi, karena pengecualian mengatakan tampilan sebagian tidak berasal dari "UserControl".
Bagaimana cara memperbaiki rendering untuk mendukung tampilan sebagian pisau cukur?
Saya memerlukan ini karena saya menghasilkan email dari tampilan parsial ini ...
MEMPERBARUI:
Kode yang gagal (@mcl):
public string RenderPartialToString(string controlName, object viewData)
{
ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };
viewPage.Url = this.GetUrlHelper();
string fullControlName = "~/Views/Email/" + controlName + ".ascx";
viewPage.ViewData = new ViewDataDictionary(viewData);
viewPage.Controls.Add(viewPage.LoadControl(fullControlName));
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
{
using (HtmlTextWriter tw = new HtmlTextWriter(sw))
{
viewPage.RenderControl(tw);
}
}
return sb.ToString();
}
c#
asp.net-mvc
razor
Peter Stegnar
sumber
sumber
Jawaban:
Memperbarui
sumber
Meskipun jawaban yang memadai telah diberikan, saya ingin mengusulkan solusi yang tidak terlalu bertele-tele, yang dapat digunakan tanpa metode helper yang tersedia di kelas pengontrol MVC. Menggunakan pustaka pihak ketiga yang disebut "RazorEngine", Anda dapat menggunakan file .Net IO untuk mendapatkan konten file pisau cukur dan memanggil
Dapatkan perpustakaan pihak ketiga di sini .
sumber
Anda juga bisa menggunakan
RenderView Controller extension
dari sini ( sumber )dan gunakan seperti ini:
ini berfungsi untuk mesin tampilan pisau cukur dan formulir web
sumber
Saya melihat seseorang bertanya-tanya bagaimana melakukannya untuk pengontrol lain.
Dalam kasus saya, saya memiliki semua templat email saya di folder Tampilan / Email, tetapi Anda dapat memodifikasi ini untuk meneruskan pengontrol di mana Anda memiliki pandangan yang terkait dengannya.
Pada dasarnya apa yang dilakukan ini adalah mengambil pengontrol, seperti AccountController dan memodifikasinya agar dianggap sebagai EmailController sehingga kode akan terlihat di
Views/Email
folder. Ini perlu dilakukan karenaFindView
metode tidak mengambil jalur lurus ke atas sebagai parameter, ia menginginkan aControllerContext
.Setelah selesai merender string, itu mengembalikan AccountController kembali ke keadaan awalnya untuk digunakan oleh objek Respon.
sumber
kode yang bagus; sedikit petunjuk: jika Anda terkadang harus melewati lebih banyak data dan tidak hanya viewmodel ..
sumber
Meminjam jawaban @jgauffin sebagai ekstensi HtmlHelper:
Penggunaan dalam tampilan pisau cukur:
sumber