Отправьте asp.net mvc результат действия в электронной почте

С помощью data.table вы можете:

library(data.table)
setDT(dt)[,scale(fc),by=rep(1:nn,each=ceiling(KK/nn),length.out=KK)]

Здесь KK - 130 209, а nn - 12. Воспроизводимые данные:

set.seed(100)
KK<-130209L; nn<-12L
dt<-data.frame(mLow1=rnorm(KK),mHigh1=rnorm(KK),
               mLow2=rnorm(KK),mHigh2=rnorm(KK),
               meanLow=rnorm(KK),meanHigh=rnorm(KK),
               fc=rnorm(KK),mean=rnorm(KK))

So нет необходимости разбивать данные и рекомбинировать.

Если вы хотите добавить это в кадр данных, а не просто извлечь его, вы можете использовать оператор := для назначения по ссылке:

setDT(dt)[,fc_scaled:=scale(fc)...]
22
задан appqui-platform 6 February 2009 в 16:10
поделиться

6 ответов

Вот , как получить представление как строку.

6
ответ дан Community 21 July 2019 в 16:48
поделиться

Во-первых, Вы все еще, вероятно, захотите возвратить представление из своего действия, так возврат EmptyResult не является лучшим; но Вы поймете это, когда Вы будете иметь дело с потоком страницы в своем процессе регистрации.

я предполагаю, что Вы хотите создать электронное письмо HTML с помощью Представления, которое Вы уже создали. Это означает, что Вы хотите взять результат чего-то, что похоже на следующее:

public ActionResult CreateEmailView(RegistrationInformation info)
{
  var userInformation = Membership.CreateNewUserLol(info);
  return View(userInformation)
}

и отправляют это как тело электронной почты. Вы добираетесь для многократного использования представлений и всего того забавного материала.

можно использовать в своих интересах платформу путем создания пользовательского ActionResult и использования этого для генерации текста.

Вот некоторый псевдокод c#-like, который мог бы на самом деле скомпилировать и работа. Во-первых, пользовательский ActionResult:

public class StringResult : ViewResult
{
    public string Html { get; set; }
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (string.IsNullOrEmpty(this.ViewName))
        {
            this.ViewName = 
                 context.RouteData.GetRequiredString("action");
        }
        ViewEngineResult result = null;
        if (this.View == null)
        {
            result = this.FindView(context);
            this.View = result.View;
        }
        ViewContext viewContext = new ViewContext(
                context, this.View, this.ViewData, this.TempData);
        using (var stream = new MemoryStream())
        using (var writer = new StreamWriter(stream))
        {
            // used to write to context.HttpContext.Response.Output
            this.View.Render(viewContext, writer);
            writer.Flush();
            Html = Encoding.UTF8.GetString(stream.ToArray());
        }
        if (result != null)
        {
            result.ViewEngine.ReleaseView(context, this.View);
        }
    }
}

Это переопределяет ExecuteResult базового метода (это - код от базового метода, я являюсь переопределяющим; возможно, изменился в RC1) представлять к потоку, которым я управляю вместо Потока вывода Ответа. Таким образом, это вытаскивает текст точно, как это было бы представлено к клиентской машине.

Затем, как Вы использовали бы это в действии контроллера:

public ActionResult CreateEmailView(RegistrationInformation info)
{
  var userInformation = Membership.CreateNewUserLol(info);
  // grab our normal view so we can get some info out of it
  var resultView = View(userInformation);

  // create our string result and configure it
  StringResult sr = new StringResult();
  sr.ViewName = resultView.ViewName;
  sr.MasterName = resultView.MasterName;
  sr.ViewData = userInformation;
  sr.TempData = resultView.TempData;
  // let them eat cake
  sr.ExecuteResult(this.ControllerContext);
  string emailHtml = sr.Html;
  // awesome utils package, dude
  Utils.SendEmailKThx(userInformation, emailHtml);

  return resultView;
}

я представляю то же представление дважды; в первый раз, когда я представляю его к потоку и во второй раз, я обычно представляю его. Могло бы быть возможно красться в цепочку вызовов ViewResult где-то в другом месте и измениться, как Рендеринг работает, но поверхностный взгляд на код ничего не показывает. В то время как платформа довольно хороша, стек вызовов для частей процесса являются просто не достаточно мелкомодульными, чтобы помочь изменить одноэтапное в процессе. Если они повредили ExecuteResult в несколько различных переопределяемых методов, мы, возможно, изменили его от рендеринга до потока вывода к рендерингу к нашему потоку, не переопределяя весь метод ExecuteResult. О, хорошо....

13
ответ дан 29 November 2019 в 05:31
поделиться

У меня нет достаточного количества представителя для комментария, но я думал, что сэкономлю людям некоторое время путем указания, что кажется, что принятый ответ работал бы, и было бы замечательно, если бы это сделало. Однако кажется, что Механизм Представления WebForm просто ест параметр TextWriter. Здесь существует больше информации: http://ayende.com/Blog/archive/2008/11/11/another-asp.net-mvc-bug-rendering-views-to-different-output-source.aspx

6
ответ дан Jonathan 29 November 2019 в 05:31
поделиться

Вы не видите само представление в контроллере. Способ сделать, что Вы спрашиваете, состоял бы в том, чтобы записать пользовательский подкласс ActionResult и пользовательский ViewEngine для обработки его. Переопределите ExecuteResult для фактической отправки электронного письма. Посмотрите на Spark с открытым исходным кодом, NHAML, и т.д., механизмы представления для MVC для примеров.

1
ответ дан Craig Stuntz 29 November 2019 в 05:31
поделиться

Эй Будет, от того, что я читаю (и моя собственная попытка реализовать Ваше решение) Представление. Метод рендеринга полностью игнорирует параметр устройства записи. Содержание моего устройства записи всегда пусто, и вместо этого представленное представление выболтано в к ответному потоку. Таким образом, это кажется невозможным (или довольно замысловатый, по крайней мере) для получения использования, Вы просматриваете как этот. Я думаю в Вашем тестовом сценарии, Вы видели бы представленное представление дважды, и Ваша электронная почта будет пробелом.

Я нашел некоторое обсуждение этого здесь: http://ayende.com/Blog/archive/2008/11/11/another-asp.net-mvc-bug-rendering-views-to-different-output-source.aspx

0
ответ дан 29 November 2019 в 05:31
поделиться

http://www.brightmix.com/blog/renderpartial-to-string-in-asp-net-mvc/ предлагает хорошее решение для рендеринга представления в строку, чтобы вы могли отправить его по электронной почте. . Он отмечает, что «рендеринг частичного представления строки, к счастью, стал намного, намного проще».

/// Static Method to render string - put somewhere of your choosing
public static string RenderPartialToString(string controlName, object viewData)
{
     ViewDataDictionary vd = new ViewDataDictionary(viewData);
     ViewPage vp = new ViewPage { ViewData = vd };
     Control control = vp.LoadControl(controlName);

     vp.Controls.Add(control);

     StringBuilder sb = new StringBuilder();
     using (StringWriter sw = new StringWriter(sb))
     {
         using (HtmlTextWriter tw = new HtmlTextWriter(sw))
         {
             vp.RenderControl(tw);
         }
     }

     return sb.ToString();
}
5
ответ дан 29 November 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: