2010-09-13 2 views
1

Привет, я создаю небольшую веб-страницу, которая дает нашим пользователям интерфейс для поиска в нашей базе данных.ASP.NET MVC Use Controller или View вне контекста приложения MVC

Этот сайт должен предоставить 2 веб-сервиса функции, поиск (строка SearchString) и GetAccountInfoByInitials (строка инициалов)

Я хотел бы использовать свои контроллеры, чтобы сделать это, но я не могу выяснить, как я могу получить HTML из ViewResult.

Я судимое следующее, но result.ToString() только дать мне строку «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; 
} 

} 

ответ

0

Это ответ на вопрос, который я отправил подобный этому: 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); 
    } 
} 

Затем, чтобы сделать файл:

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

Я делаю это почти идентичным образом, но на самом деле использовать контроллер должен возвращать частичное представление в строку.

я использую следующий метод расширения в моем регуляторе:

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(); 
    } 
} 

следует затем возвращая мой PartialView следующим образом:

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

Это следует надеяться, вроде вас.

+0

Как создать класс контроллера в вашем веб оказание услуг? Я продолжаю получать исключение NULL на контроллере.ControllerContext – Androme

+0

DoomStone, мой случай действительно отличается, поскольку он является публичным api и поэтому фактически перекачивается через контроллер, а не через веб-сервис. i guees, ваше требование немного отличается от моего внедрения в этом случае ... :( –

+0

.. просто чтобы добавить, этот вопрос SO-типа охватывает мой подход (т. е. использование mvc как службы RESTful, а не использование веб-сервисов. могут потребоваться элементы безопасности подхода webservice, и в этом случае все ставки отключены. В любом случае - SO Q -> http://stackoverflow.com/questions/118931/asp-net-mvc-web-services –

0

Результат просмотра не содержит страницу отдельно. Asp.net MVC использует его вместе с View Engine, настроенным для получения фактической страницы.

Вы попадете в блокпост, если используете механизм просмотра по умолчанию - см. link text. В основном потому, что механизм просмотра asp.net привязан к контексту. Другие механизмы просмотра не дадут вам этой проблемы, но если активы, которые вы пытаетесь уменьшить, уже полагаются на механизм просмотра по умолчанию, который побеждает цель. Есть и другие способы, но я не уверен, насколько это удобно для вас.