我一直试图弄清楚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?
答案 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.Action 和 Html.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。