2010-12-13 22 views
0

est-il possible d'obtenir le résultat d'une action dans une variable chaînecomment obtenir le résultat d'une action (html) dans une variable chaîne

je besoin de quelque chose comme ceci:

public ActionResult Do() 
{ 
    var s = this.Index().GetStringResult(); 
    ... 

} 
+0

oui, il y a quelques méthodes. va coller mes extensions mvc2 pour cela dans un post séparé. –

+0

Voir cette réponse pour le rendu des vues en chaînes: http://stackoverflow.com/q/483091/261677 –

Répondre

2

Omu - essayez ces pour la taille:

public static class ExtensionMethods 
{ 
    // usage 
    /* 
     var model = _repository.Find(x => x.PropertyID > 3).FirstOrDefault(); 
     var test = this.RenderViewToString("DataModel", model); 
     return Content(test); 
    */ 
    public static string RenderViewToString<T>(this ControllerBase controller, 
          string viewName, T model) 
    { 
     using (var writer = new StringWriter()) 
     { 
      ViewEngineResult result = ViewEngines 
         .Engines 
         .FindView(controller.ControllerContext, 
           viewName, null); 

      var viewPath = ((WebFormView)result.View).ViewPath; 
      var view = new WebFormView(viewPath); 
      var vdd = new ViewDataDictionary<T>(model); 
      var viewCxt = new ViewContext(
           controller.ControllerContext, 
           view, 
           vdd, 
           new TempDataDictionary(), writer); 
      viewCxt.View.Render(viewCxt, writer); 
      return writer.ToString(); 
     } 
    } 

    public static string RenderPartialToString<T>(
          this ControllerBase controller, 
          string partialName, T model) 
    { 
     var vd = new ViewDataDictionary(controller.ViewData); 
     var vp = new ViewPage 
     { 
      ViewData = vd, 
      ViewContext = new ViewContext(), 
      Url = new UrlHelper(controller.ControllerContext.RequestContext) 
     }; 

     ViewEngineResult result = ViewEngines 
            .Engines 
            .FindPartialView(
               controller.ControllerContext, 
               partialName); 

     if (result.View == null) 
     { 
      throw new InvalidOperationException(
      string.Format("The partial view '{0}' could not be found", 
          partialName)); 
     } 
     var partialPath = ((WebFormView)result.View).ViewPath; 

     vp.ViewData.Model = model; 

     Control control = vp.LoadControl(partialPath); 
     vp.Controls.Add(control); 

     var sb = new StringBuilder(); 

     using (var sw = new StringWriter(sb)) 
     { 
      using (var tw = new HtmlTextWriter(sw)) 
      { 
       vp.RenderControl(tw); 
      } 
     } 
     return sb.ToString(); 
    } 
} 
utilisation

(vue normale):

var s = this.RenderViewToString("Index", null); // or model if required 

et pour une partie:

var s = this.RenderPartialToString("PartialView, model) // etc 
+0

Nous le faisons aussi de cette façon! –

+0

oui, pour mvc2, c'est un bon moyen d'extraire les différents types de vues. Je suis 'presque' certain que mvc3 inclut ce 'out of the box'. Je ne l'ai pas encore essayé mais je le ferai en 2011 :). salutations de saison ... –

0

Pourquoi ne pas prendre l'action de l'index et extraire tout son code dans une fonction séparée comme ceci:

public ActionResult Index() 
{ 
    Response.Write(GetActionString()); 
    return new EmptyResult(); 
} 

private void GetActionString() 
{ 
    //Code which produces the index string; 
} 

public ActionResult Do() 
{ 
    var s = GetActionString(); 
    ... 
    return View(); 
} 

Si vous avez besoin du rendu HTML à partir de l'indice après avoir été passé à une vue, vous devez créer un HttpRequest dans le code et lire le résultat de cela.

+0

car l'index renvoie View() – Omu