【问题标题】:The difference between Html.Action and Html.RenderActionHtml.Action 和 Html.RenderAction 的区别
【发布时间】:2011-08-14 05:07:38
【问题描述】:

我一直试图弄清楚 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 烦恼吗?

【问题讨论】:

  • 这两种方法都允许您从视图中调用操作方法并在视图中输出操作的结果。两者的区别在于 Html.RenderAction 会将结果直接渲染到 Response 中(如果 action 返回大量 HTML,效率会更高),而 Html.Action 会返回带有结果的字符串。

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


【解决方案1】:

试试:

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

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

代替

@Html.RenderAction()

使用

@{Html.RenderAction();}

【讨论】:

  • 这确实起到了作用。当我读到 RenderAction 将结果直接呈现给响应时,我真的不明白这意味着什么。另外,你能解释一下或指出我在哪里可以找到 @{HTML()} 与 @HTML() 的区别吗?
  • @{..} 是代码块,@.. 是表达式,看看-haacked.com/archive/2011/01/06/…
  • 我相信你需要一个分号在语句的末尾,就在结束 } 之前。否则 razor 会抛出 HttpCompileException。
  • 有一个很棒的视频解释了部分与渲染部分..这将阐明 {Html ;} youtube.com/watch?v=SABg7RyjX-4
【解决方案2】:

来自Phil Haack

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

【讨论】:

    【解决方案3】:

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

    这将返回视图的 Html 字符串。

    【讨论】:

      【解决方案4】:

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

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

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

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

      据我说,仅当您想对字符串进行一些修改时才使用 Html.Action,否则使用 Html.RenderAction。

      【讨论】:

        猜你喜欢
        • 2011-02-26
        • 1970-01-01
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多