Je ne peux pas rendre une vue à une chaîne, puis rediriger, malgré this answer from Feb (après la version 1.0, je pense) qui prétend que c'est possible. Je pensais que je faisais quelque chose de mal, et puis j'ai lu ce answer from Haack in July qui prétend que ce n'est pas possible.Rendu d'une vue à une chaîne dans MVC, puis redirection - solutions de contournement?
Si quelqu'un l'a fait fonctionner et peut m'aider à le faire fonctionner, c'est génial (et je posterai du code, des erreurs). Cependant, je suis sur le point d'avoir besoin de solutions de contournement. Il y en a quelques-uns, mais rien d'idéal. Quelqu'un a-t-il résolu cela ou a-t-il des commentaires sur mes idées?
- Ceci est de rendre le courrier électronique. Bien que je puisse sûrement envoyer l'email en dehors de la requête web (stocker des informations dans un db et l'obtenir plus tard), il y a beaucoup de types de mails et je ne veux pas stocker les données du template (objet utilisateur, quelques autres objets LINQ) dans un db pour le laisser être rendu plus tard. Je pourrais créer un POCO plus simple et sérialisable et le sauvegarder dans le db, mais pourquoi? ... Je veux juste du texte rendu!
- Je peux créer un nouvel objet RedirectToAction qui vérifie si les en-têtes ont été envoyés (ne peut pas comprendre comment faire cela - try/catch?) Et, si c'est le cas, construit une page simple avec une méta-redirection, une redirection JavaScript, ainsi qu'un lien "cliquez ici".
- Dans mon contrôleur, je peux me rappeler si j'ai rendu un email et, si c'est le cas, manuellement # 2 en affichant une vue.
- Je peux envoyer manuellement les en-têtes de redirection avant tout rendu de courrier électronique potentiel. Ensuite, plutôt que d'utiliser l'infrastructure MVC pour rediriger vers l'action, j'appelle simplement result.end. Cela semble plus facile, mais vraiment salissant.
- Autre chose?
EDIT: J'ai essayé le code de Dan (très similaire au code de Jan/Feb que je l'ai déjà essayé) et je me fais toujours la même erreur. La seule différence substantielle que je peux voir est que son exemple utilise une vue pendant que j'utilise une vue partielle. Je vais essayer de tester cela plus tard avec une vue.
Voici ce que j'ai:
Contrôleur
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();
}
SendEmail()
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;
}
CustomRenderers
public class CustomRenderers
{
public virtual string RenderViewToString3(ControllerContext controllerContext, string viewPath, string masterPath, ViewDataDictionary viewData, TempDataDictionary tempData)
{
//copy/paste of dan's code
}
}
Erreur
[HttpException (0x80004005): Cannot redirect after HTTP headers have been sent.]
System.Web.HttpResponse.Redirect(String url, Boolean endResponse) +8707691
Merci, James
Avez-vous déjà trouvé ce produit? – Kirschstein