SORU
27 Ocak 2009, Salı


Bir Render bir dize olarak

Çıkış için iki farklı görüş (e-posta olarak gönderilecek bir dize olarak) istiyorum, ve bu sayfa başka bir kullanıcı için görüntülenir.

Bu ASP.NET MVC beta mümkün mü?

Birden çok örnek denedim:

RenderPartial to String in ASP.NET MVC Beta

MVC Framework: Capturing the output of a view

Herkes bu sorunlar için çözümler/herhangi bir fikrim yok, ya da daha iyileri için herhangi bir öneriniz var mı?

Çok teşekkürler!

Aşağıda bir örnek. Yapmaya çalıştığım şey GetViewForEmail yöntemi oluşturun

public ActionResult OrderResult(string ref)
{
  //Get the order
  Order order = OrderService.GetOrder(ref);

  //The email helper would do the meat and veg by getting the view as a string
  //Pass the control name (OrderResultEmail) and the model (order)
  string emailView = GetViewForEmail("OrderResultEmail", order);

  //Email the order out
  EmailHelper(order, emailView);
  return View("OrderResult", order);
}

Tim Scott gelen cevap (ve bana göre biraz değişti biçimlendirilmiş) kabul:

public virtual string RenderViewToString(
  ControllerContext controllerContext,
  string viewPath,
  string masterPath,
  ViewDataDictionary viewData,
  TempDataDictionary tempData)
{
  Stream filter = null;
  ViewPage viewPage = new ViewPage();

  //Right, create our view
  viewPage.ViewContext = new ViewContext(controllerContext, new WebFormView(viewPath, masterPath), viewData, tempData);

  //Get the response context, flush it and get the response filter.
  var response = viewPage.ViewContext.HttpContext.Response;
  response.Flush();
  var oldFilter = response.Filter;

  try
  {
      //Put a new filter into the response
      filter = new MemoryStream();
      response.Filter = filter;

      //Now render the view into the memorystream and flush the response
      viewPage.ViewContext.View.Render(viewPage.ViewContext, viewPage.ViewContext.HttpContext.Response.Output);
      response.Flush();

      //Now read the rendered view.
      filter.Position = 0;
      var reader = new StreamReader(filter, response.ContentEncoding);
      return reader.ReadToEnd();
  }
  finally
  {
      //Clean up.
      if (filter != null)
      {
        filter.Dispose();
      }

      //Now replace the response filter
      response.Filter = oldFilter;
  }
}

Örnek kullanım

Sipariş onay almak için denetleyici bir çağrı varsayarsak, Site geçen e-posta.Ana konum.

string myString = RenderViewToString(this.ControllerContext, "~/Views/Order/OrderResultEmail.aspx", "~/Views/Shared/Site.Master", this.ViewData, this.TempData);

CEVAP
3 Mayıs 2010, PAZARTESİ


Buraya kadar geldim, ve benim için işe yarıyor. Aşağıdaki yöntem(ler) denetleyicisi temel dersime ekledim. (Her zaman bu statik yöntemler sanırım bir parametre olarak kabul eden bir denetleyici başka bir yerde yapın)

MVC2 .ascx tarzı

protected string RenderViewToString<T>(string viewPath, T model) {
  ViewData.Model = model;
  using (var writer = new StringWriter()) {
    var view = new WebFormView(ControllerContext, viewPath);
    var vdd = new ViewDataDictionary<T>(model);
    var viewCxt = new ViewContext(ControllerContext, view, vdd,
                                new TempDataDictionary(), writer);
    viewCxt.View.Render(viewCxt, writer);
    return writer.ToString();
  }
}

Jilet .cshtml tarzı

public string RenderRazorViewToString(string viewName, object model)
{
  ViewData.Model = model;
  using (var sw = new StringWriter())
  {
    var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext,
                                                             viewName);
    var viewContext = new ViewContext(ControllerContext, viewResult.View,
                                 ViewData, TempData, sw);
    viewResult.View.Render(viewContext, sw);
    viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
    return sw.GetStringBuilder().ToString();
  }
}

Edit: Razor kod eklendi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonah Penna

    Jonah Penna

    11 EYLÜL 2005
  • Mr_BrettHooge

    Mr_BrettHoog

    3 Ocak 2011
  • SalGames2016

    SalGames2016

    17 Kasım 2012