Я не могу отобразить представление в строке, а затем перенаправить, несмотря на этот ответ от февраля (я думаю, после версии 1.0), которая утверждает, что это возможно. Я подумал, что делаю что-то не так, а потом прочитал ответ Хаака в июле, утверждающий, что это невозможно.
Если у кого-то это работает и может помочь мне заставить его работать, это здорово (и я опубликую код, ошибки). Однако сейчас мне нужны обходные пути. Есть несколько, но ничего идеального. Кто-нибудь решил это или есть комментарии по поводу моих идей?
- Это для отображения электронной почты. Хотя я могу точно отправить электронное письмо за пределами веб-запроса (сохранить информацию в базе данных и получить ее позже), существует много типов электронных писем, и я не хочу хранить данные шаблона (объект пользователя, несколько других объектов LINQ ) в БД, чтобы он был отрисован позже. Я мог бы создать более простой сериализуемый POCO и сохранить его в базе данных, но почему? ... Мне просто нужен визуализированный текст!
- Я могу создать новый объект RedirectToAction, который проверяет, были ли отправлены заголовки (не могу понять, как это сделать - попробуйте / поймать?), И, если да, строит простую страницу с мета-перенаправлением, перенаправлением javascript , а также ссылку «щелкните здесь».
- В моем контроллере я могу вспомнить, отображал ли я электронное письмо, и если да, то вручную выполняю №2, отображая представление.
- Я могу вручную отправить заголовки перенаправления перед любой потенциальной отправкой электронной почты. Затем, вместо того, чтобы использовать инфраструктуру MVC для перенаправления действия, я просто вызываю result.end. Это кажется самым простым, но действительно беспорядочным.
- Что-нибудь еще?
ИЗМЕНИТЬ: я пробовал код Дэна (очень похожий на код от января / февраля, который я уже пробовал), но все еще получаю ту же ошибку. Единственное существенное различие, которое я вижу, заключается в том, что в его примере используется представление, а я - частичное представление. Я попробую проверить это позже с целью.
Вот что у меня есть:
Контроллер
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
}
}
Ошибка
[HttpException (0x80004005): Cannot redirect after HTTP headers have been sent.]
System.Web.HttpResponse.Redirect(String url, Boolean endResponse) +8707691
Спасибо, Джеймс