185 messaggi dal 05 novembre 2009
Ciao a tutti ho un problema con lo scope della variabile Session tra Action di uno stesso controller, vi possto il codice:
 
 public ActionResult WelcomeEmail(string Email)
        {

            <b>string EmailM =(string) Session["Email"]</b> ;
            Cliente u = new ClienteRepository().Get(EmailM);
            if (u != null)
            {
                ViewData["email"] = u.Email;
                ViewData["pss"] = u.Password;
            }
            return View();
        }

        public void SendTemplatedEmail(string from,
                                      string to,
                                     string subject,
                                      string templatePath)
        { 

            MailMessage mm = new MailMessage(from, to);
            mm.Subject = subject;
            string _host = System.Configuration.ConfigurationManager.AppSettings["Host"];
            string _userName = ConfigurationManager.AppSettings["Username"];
            string _password = ConfigurationManager.AppSettings["Password"];
            mm.Body = GetEmailBody(templatePath);

            if (mm.Body != "")
            {
                mm.IsBodyHtml = true;
                SmtpClient smtp = new SmtpClient(_host);
                smtp.Credentials = new NetworkCredential(_userName, _password);
                smtp.Send(mm);
            }
        }

        public string GetEmailBody(string templatePath)
        {
            System.Net.WebClient objWebClient = new System.Net.WebClient();
            byte[] aRequestedHTML = null;
            string strRequestedHTML = null;
            string path = templatePath;
            aRequestedHTML = objWebClient.DownloadData(path);
            System.Text.UTF8Encoding objUTF8 = new System.Text.UTF8Encoding();
            strRequestedHTML = objUTF8.GetString(aRequestedHTML);

            return strRequestedHTML;
        }



La variabile Session["Email"] e' creata in una action dello stesso controller, la mia action WelcomeEmail(string Email) in questo caso viene richiamata dall'istruzione del metodo GetEmailBody(string templatePath) aRequestedHTML =objWebClient.DownloadData(path);

Non caspisco perche' la variabile Session che richiamo nella Action WelcomeEmail sia nulla.

Spero di essere stato chiaro

Grazie mille
5.610 messaggi dal 09 febbraio 2002
Contributi
Ciao,
è comprensibile che questo succeda perché alla tua istanza di WebClient non hai aggiunto il cookie di autenticazione. Il server percepirà questa richiesta come proveniente da un utente anonimo, dato che manca il cookie.

Comunque... abbandona questa strada, si presta molto facilmente a problemi, come hai già potuto sperimentare.

Razor può essere usato anche separatamente da MVC e questo ti consente di sfruttarne la potenza senza dover effettuare chiamate web con il WebClient. Perciò potresti addirittura usarlo in applicazioni windows.

La cosa più semplice da fare è aggiungere un riferimento al progetto RazorEngine che trovi su Codeplex. Lo puoi installare facilmente usando NuGet.

Dopodiché, modifica il tuo metodo GetEmailBody così (diventa veramente semplice ed efficiente).

 public string GetEmailBody(string templatePath, Cliente u)
        {
  string template = "Bevenuto @Model.Email! La tua password è @Model.Password!";
return Razor.Parse(template, new { u.Email, u.Password });
        }

Grazie al progetto RazorEngine puoi sfruttare Razor in due righe di codice, letteralmente.
Ovviamente questo codice è puramente dimostrativo. Tu, penso, vorrai salvare ogni template e-mail in un proprio file .cshtml, così da poter contare sull'intellisense di Visual Studio mentre li crei o li modifichi. Volendo leggere il template da file, modifica il codice così:

string template = System.IO.File.ReadAllText(Server.MapPath("~/Content/Templates/Benvenuto.cshtml"));


In ultimo, elimina la tua action WelcomeEmail dato che ormai non serve più.

ciao,
Modificato da BrightSoul il 22 ottobre 2011 11.27 -

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
185 messaggi dal 05 novembre 2009
Ciao, la tua soluzione e' spettacolare :-) Hai perfettamente centrato il punto,ho dovuto semplicemente eseguire solo i passi da te elencati...Adesso ho solo un piccolo problema quando cerco di passargli direttamente la partialview, sto'cercando di risolverlo, ma cmq ti posto l'errore nel caso avessi gia' un'idea

RazorEngine.Templating.TemplateCompilationException was unhandled by user code
  Message=Unable to compile template. Check the Errors list for details.
  Source=RazorEngine
  StackTrace:
       at RazorEngine.Compilation.DirectCompilerServiceBase.CompileType(TypeContext context)
       at RazorEngine.Templating.TemplateService.CreateTemplate(String template, Type modelType)
       at RazorEngine.Templating.TemplateService.GetTemplate(String template, Type modelType, String name)
       at RazorEngine.Templating.TemplateService.Parse[T](String template, T model, String name)
       at RazorEngine.Razor.Parse[T](String template, T model, String name)
       at ScontiSubito.Controllers.RegistrazioneController.GetEmailBody(String templatePath, Cliente u) in C:\Users\Marcos\Documents\Visual Studio 2010\ProgettiDiTest\TestEmailManagerLocale\EmailManager\ScontiSubito\Controllers\RegistrazioneController.cs:line 499
       at ScontiSubito.Controllers.RegistrazioneController.SendTemplatedEmail(String from, String to, String subject, String templatePath, Cliente u) in C:\Users\Marcos\Documents\Visual Studio 2010\ProgettiDiTest\TestEmailManagerLocale\EmailManager\ScontiSubito\Controllers\RegistrazioneController.cs:line 483
       at ScontiSubito.Controllers.RegistrazioneController.Create(Cliente obj, String returnUrl) in C:\Users\Marcos\Documents\Visual Studio 2010\ProgettiDiTest\TestEmailManagerLocale\EmailManager\ScontiSubito\Controllers\RegistrazioneController.cs:line 197
       at lambda_method(Closure , ControllerBase , Object[] )
       at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
       at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
       at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
  InnerException: 


Grazie ancora
Modificato da Govinda il 24 ottobre 2011 08.39 -
Modificato da Govinda il 24 ottobre 2011 08.49 -
Modificato da Govinda il 24 ottobre 2011 08.49 -
185 messaggi dal 05 novembre 2009
Ho risolt0:-), lasciando la view Benvenuto in questo modo
<html>
<head>
    <title>WelcomeEmail</title>
</head>
<body>
    <div>
      Bevenuto @Model.Email! La tua password è @Model.Password!
    </div>
</body>
</html>


quindi nessun riferimento ad un layout e niente tipizzazione della view(tanto questo avviene nel controller). Quindi tutto funziona perfettamente e la soluzione mi piace moltissimo, diciamo che ne e' uscito un post molto costruttivo.

Grazie veramente
185 messaggi dal 05 novembre 2009
Ciao BrightSoul, scuami se ti posto un'altro quesito, cmq sempre se puoi. Io adesso riesco a generare testo nel body proveniente da una View, ma e' possibile trasforamre una view in un file pdf da inviare come allegato?

ho creato un post apposito per questo problema, lo faccio per rendere facilmente rintracciabili i vari quesiti per facilitare chi come me e' alla ricerca di soluzioni, questo il link:http://forum.aspitalia.com/forum/post/384060/Creare-Pdf-Partire-View-Asp.Net-Mvc.aspx#384060

Grazie mille
Modificato da Govinda il 24 ottobre 2011 14.33 -
Modificato da Govinda il 24 ottobre 2011 14.34 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC