2010-09-13 4 views
1

Bonjour, je crée une petite page Web qui offre à nos utilisateurs une interface de recherche dans notre base de données.ASP.NET MVC Utilisation du contrôleur ou de la vue en dehors du contexte de l'application MVC

Ce site doit fournir 2 fonctions WebService, Recherche (chaîne searchString) et GetAccountInfoByInitials (initiales de chaîne)

Je voudrais utiliser mes contrôleurs pour ce faire, mais je ne peux pas savoir comment je peux obtenir le code html sur un ViewResult.

je tryed ce qui suit, mais le result.ToString() ne me donner la chaîne « System.Web.Mvc.ViewResult »

public class SearchService : ISearchService 

{ 

private readonly ServiceHandlerController _controller; 
public SearchService() 
{ 
    _controller = new ServiceHandlerController(); 
} 

public string Search(string searchString) 
{ 
    var result = _controller.Search(searchString); 
    return result.ToString(); 
} 

public string GetAccountInfoByInitials(string initials) 
{ 
    var result = _controller.Search(initials).ToString(); 
    return result; 
} 

} 

Répondre

0

Ceci est une réponse à une question que j'ai posté similaire à celui-ci: Is there a way to process an MVC view (aspx file) from a non-web application?

public class AspHost : MarshalByRefObject 
{ 
    public string _VirtualDir; 
    public string _PhysicalDir; 

    public string ViewToString<T>(string aspx, Dictionary<string, object> viewData, T model) 
    { 
     StringBuilder sb = new StringBuilder(); 
     using (StringWriter sw = new StringWriter(sb)) 
     { 
      using (HtmlTextWriter tw = new HtmlTextWriter(sw)) 
      { 
       var workerRequest = new SimpleWorkerRequest(aspx, "", tw); 
       HttpContext.Current = new HttpContext(workerRequest); 

       ViewDataDictionary<T> viewDataDictionary = new ViewDataDictionary<T>(model); 
       foreach (KeyValuePair<string, object> pair in viewData) 
       { 
        viewDataDictionary.Add(pair.Key, pair.Value); 
       } 

       object view = BuildManager.CreateInstanceFromVirtualPath(aspx, typeof(object)); 

       ViewPage viewPage = view as ViewPage; 
       if (viewPage != null) 
       { 
        viewPage.ViewData = viewDataDictionary; 
       } 
       else 
       { 
        ViewUserControl viewUserControl = view as ViewUserControl; 
        if (viewUserControl != null) 
        { 
         viewPage = new ViewPage(); 
         viewPage.Controls.Add(viewUserControl); 
        } 
       } 

       if (viewPage != null) 
       { 
        HttpContext.Current.Server.Execute(viewPage, tw, true); 

        return sb.ToString(); 
       } 

       throw new InvalidOperationException(); 
      } 
     } 
    } 

    public static AspHost SetupFakeHttpContext(string physicalDir, string virtualDir) 
    { 
     return (AspHost)ApplicationHost.CreateApplicationHost(
      typeof(AspHost), virtualDir, physicalDir); 
    } 
} 

Ensuite, pour rendre un fichier:

var host = AspHost.SetupFakeHttpContext("Path/To/Your/MvcApplication", "/"); 
var viewData = new ViewDataDictionary<SomeModelType>(){ Model = myModel }; 
String rendered = host.ViewToString("~/Views/MyView.aspx", new Dictionary<string, object>(viewData), viewData.Model); 
0

Je le fais dans presque un mode identique mais en fait utiliser la controller lui-même pour retourner une vue partielle à la chaîne.

i utiliser la méthode d'extension suivante dans mon contrôleur de base:

public static class ExtensionMethods 
{ 
    public static string RenderPartialToString(this ControllerBase controller, string partialName, object 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(); 
    } 
} 

suivie puis mon retour PartialView de la façon suivante:

return Content(this.RenderPartialToString("myPartialView", myModel)); 

Cela devrait, espérons sorte que vous sortir.

+0

Comment créer la classe Controller dans votre web un service? Je reçois toujours une exception nulle sur controller.ControllerContext – Androme

+0

DoomStone, mon cas diffère en fait car c'est une API publique et donc est réellement lancé via le contrôleur, plutôt que via un webservice. Je réponds que votre exigence est légèrement différente de mon implentation dans ce cas ... :( –

+0

.. juste pour ajouter, cette question SO couvre un peu mon approche (c.-à-d. en utilisant mvc comme un service RESTful, plutôt que d'utiliser des services web. peut exiger les éléments de sécurité de l'approche webservice, auquel cas tous les paris sont désactivés de toute façon - SO Q -> http://stackoverflow.com/questions/118931/asp-net-mvc-web-services –

0

Le résultat de la vue ne contient pas la page en elle-même. Asp.net MVC l'utilise, ainsi que View Engine configuré pour obtenir la page réelle.

Vous rencontrerez un roadblock si vous utilisez le moteur de vue par défaut - voir link text. Fondamentalement parce que le moteur de vue asp.net est lié au contexte. Les autres moteurs de vue ne vous poseront pas ce problème, mais si les ressources que vous essayez de réduire dépendent déjà du moteur de vue par défaut, cela va à l'encontre du but recherché. Il y a d'autres façons de le contourner, mais je ne suis pas sûr que ce soit pratique pour vous.

Questions connexes