Html.Action和Html.RenderAction之间的区别

时间:2011-04-27 21:07:40

标签: .net asp.net-mvc-3 razor html-helper

我一直试图弄清楚RenderAction和Action之间的区别。我不知道我是否如此关注这一点上的差异,以及为什么我无法让RenderAction工作。据我所知,我正在传递正确的参数。我正在使用的重载似乎是相同的:

@Html.RenderAction(Action, Controller, Route)

@Html.Action("Breadcrumb", "Navigation", new {SeoUrl = Model.CarlineBucket.SEOURLName})

@Html.RenderAction("Breadcrumb", "Navigation", new {SeoUrl = Model.CarlineBucket.SEOURLName})

当我尝试使用RenderAction时出现编译错误:

  

CS1502:最佳重载方法   匹配   'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)'   有一些无效的论点。

任何提示或提示?我是否应该甚至不打扰RenderAction?

4 个答案:

答案 0 :(得分:59)

尝试:

@{Html.RenderAction("Breadcrumb", "Navigation", new {SeoUrl = Model.CarlineBucket.SEOURLName});}

@Html.RenderAction()生成一个写入调用以在页面上输出内容,在您的情况下,您没有这样做,因为RenderAction将结果直接呈现给Response。

而不是

@Html.RenderAction()

使用

@{Html.RenderAction();}

答案 1 :(得分:17)

来自Phil Haack

  

两者之间的区别在于   Html.RenderAction将呈现   直接导致响应(其中   如果行动更有效率   返回大量的HTML)   而Html.Action返回一个字符串   结果。

答案 2 :(得分:5)

Html.RenderAction的返回类型是void,这意味着它直接在View中呈现响应,其中Html.Action的返回类型为MvcHtmlString,您可以在控制器中捕获其渲染视图,通过使用以下方法

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

这将返回View的Html字符串。

答案 3 :(得分:0)

Html.ActionHtml.RenderAction 是用作父页面内可重用部分的扩展方法。

Html.RenderAction 返回 void 并将结果直接渲染到响应流(更高效和快速)而 Html.Action 的返回类型是 MvcHtmlString,它可以在写入响应流之前进行操作。

Html.Action helper 语法:
@Html.Action("Action", "Controller", new { "routeData" })

Html.Action helper 语法:
@{ Html.RenderAction("Action", "Controller", new { "routeData" }); }

据我所知,仅当您想在字符串中执行一些修改时才使用 Html.Action,否则使用 Html.RenderAction。

相关问题