Znany jest sposób generowania kodu HTML danego widoku częściowego w aparacie widoku ASP.NET .
Ale jeśli ta funkcja jest używana w widoku częściowym maszynki do golenia, nie działa, ponieważ wyjątek mówi, że widok częściowy nie pochodzi od „UserControl”.
Jak naprawić renderowanie, aby obsługiwać częściowy widok maszynki do golenia?
Potrzebuję tego, ponieważ generuję e-maile z tych częściowych widoków ...
AKTUALIZACJA:
Kod, który się nie udaje (@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
źródło
źródło
Odpowiedzi:
Aktualizacja
źródło
Chociaż udzielono już odpowiednich odpowiedzi, chciałbym zaproponować mniej rozwlekłe rozwiązanie, którego można używać bez metod pomocniczych dostępnych w klasie kontrolera MVC. Korzystając z biblioteki innej firmy o nazwie „RazorEngine”, możesz użyć IO pliku .Net, aby pobrać zawartość pliku Razor i wywołać
Pobierz bibliotekę innej firmy tutaj .
źródło
Można również użyć
RenderView Controller extension
z tutaj ( źródła )i użyj go w ten sposób:
działa dla maszynek do golenia i przeglądarek formularzy internetowych
źródło
Widziałem, że ktoś się zastanawiał, jak to zrobić dla innego kontrolera.
W moim przypadku wszystkie moje szablony wiadomości e-mail miałem w folderze Widoki / E-mail, ale możesz to zmodyfikować, aby przekazać kontroler, z którym masz skojarzone widoki.
Zasadniczo polega to na pobraniu kontrolera, takiego jak AccountController, i zmodyfikowaniu go tak, aby uważał, że jest to EmailController, aby kod wyglądał w
Views/Email
folderze. Jest to konieczne, ponieważFindView
metoda nie przyjmuje prostej ścieżki w górę jako parametru, a chceControllerContext
.Po zakończeniu renderowania ciągu zwraca AccountController z powrotem do stanu początkowego, który ma być używany przez obiekt Response.
źródło
świetny kod; mała wskazówka: jeśli czasami musisz ominąć więcej danych, a nie tylko model widoku ..
źródło
Wypożyczenie odpowiedzi @jgauffin jako rozszerzenie HtmlHelper:
Użycie w widoku brzytwy:
źródło