代码之家  ›  专栏  ›  技术社区  ›  Androme

ASP.NETMVC在MVC应用程序上下文之外使用控制器或视图

  •  1
  • Androme  · 技术社区  · 15 年前

    你好,我正在创建一个小网页,让我们的用户在我们的数据库中搜索界面。

    这个网站必须提供2个webservice函数,Search(string searchString)和GetAccountInfoByInitials(string initials)

    我想使用我的控制器来做这件事,但我无法找到我如何可以得到一个ViewResult的html。

    我试过以下方法,但是result.to字符串()只给我字符串“系统.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;
    }
    
    }
    
    3 回复  |  直到 15 年前
        1
  •  0
  •   Community Mohan Dere    8 年前

    这是对我发布的一个类似于以下问题的回答: 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);
    
        2
  •  0
  •   jim tollan    15 年前

    我以几乎相同的方式执行此操作,但实际上使用控制器iteself将partialview返回给string。

    我在基本控制器中使用以下扩展方法:

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

    希望这能帮你解决问题。

        3
  •  0
  •   Community Mohan Dere    8 年前

    如果使用默认视图引擎,则会遇到障碍-请参阅 link text . 基本上是因为asp.net视图引擎与上下文绑定。其他视图引擎不会给您这个问题,但是如果您试图减少的资产已经依赖于默认视图引擎,那么这就无法达到目的。还有其他的方法,但我不确定这些方法对你有多方便。