Разница между Html.Action и Html.RenderAction - PullRequest
33 голосов
/ 28 апреля 2011

Я пытался выяснить разницу между 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?

Ответы [ 3 ]

59 голосов
/ 28 апреля 2011

Попробуйте:

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

@Html.RenderAction() генерирует вызов записи для вывода чего-либо на странице, и в вашем случае вы этого не делаете, потому что RenderAction передает результат непосредственно в Ответ.

Вместо

@Html.RenderAction()

Использование

@{Html.RenderAction();}
17 голосов
/ 28 апреля 2011

С Фил Хаак :

Разница между ними заключается в том, что Html.RenderAction будет передавать результат непосредственно в ответ (что более эффективно, если действие возвращаетбольшое количество HTML), тогда как Html.Action возвращает строку с результатом.

5 голосов
/ 12 сентября 2012

Тип возвращаемого значения 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-строку представления.

...