代码之家  ›  专栏  ›  技术社区  ›  Dimitris Baltas

ASP.NET MVC使用视图进行渲染,而不创建控制器操作

  •  2
  • Dimitris Baltas  · 技术社区  · 14 年前

    我需要生成特定于 Customer 对象
    我想做一个 View 得到一个 顾客 对象并呈现适当的文本。

    是否有一种方法可以调用视图并获取呈现的输出,而不将其与控制器操作关联?

    理想情况下在pseydocode我会做这样的事情

    customer = new Customer();
    view = new GetCustomerEmailBodyView(customer);
    string htmlBody = view.SomeFunctionToRenderViewAndGetOutput()
    

    我找到了一个获取视图HTML的解决方案 here 具有返回StringResult(继承自ViewResult)的操作,而不是显示 Html 财产。
    但是,我仍然需要进行自定义操作来调用它,我不喜欢它依赖于ControllerContext这一事实,这使得很难测试它。

    我对MVC负责人的要求是什么?对于这个场景,我的代码应该如何构造?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Lorenzo OnoSendai    14 年前

    here

    protected string RenderPartialViewToString(string viewName, object model) {
        if (string.IsNullOrEmpty(viewName))
            viewName = ControllerContext.RouteData.GetRequiredString("action");
        ViewData.Model = model;
        using (StringWriter sw = new StringWriter()) {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);
    
            return sw.GetStringBuilder().ToString();
        }
    }
    
        2
  •  1
  •   StriplingWarrior    14 年前

        /// <summary>
        /// Generates a string based on the given PartialViewResult.
        /// </summary>
        /// <param name="partialViewResult"></param>
        /// <returns></returns>
        protected internal string RenderPartialViewToString(ViewResultBase partialViewResult)
        {
            Require.ThatArgument(partialViewResult != null);
            var context = ControllerContext;
            Require.That(context != null);
            using (var sw = new StringWriter())
            {
                if (string.IsNullOrEmpty(partialViewResult.ViewName))
                {
                    partialViewResult.ViewName = context.RouteData.GetRequiredString("action");
                }
                ViewEngineResult result;
                if (partialViewResult.View == null)
                {
                    result = partialViewResult.ViewEngineCollection.FindPartialView(context, partialViewResult.ViewName);
                    Require.That(result.View != null,
                                 () => new InvalidOperationException(
                                           "Unable to find view. Searched in: " +
                                           string.Join(",", result.SearchedLocations)));
                    partialViewResult.View = result.View;
                }
    
                var view = partialViewResult.View;
                var viewContext = new ViewContext(context, view, partialViewResult.ViewData,
                                                  partialViewResult.TempData, sw);
                view.Render(viewContext, sw);
                return sw.ToString();
            }
        }
    

    public ActionResult MyAction(...) 
    {
        var myModel = GetMyModel(...);
        string viewString = RenderPartialViewToString(PartialView("MyView", myModel));
        // do something with the string
        return someAction;
    }