Получить HTML-код от ActionResult в виде бритвы - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть следующий класс:

public static class WidgetHelper
{
    public static ActionResult RenderWidget<T>(this HtmlHelper htmlHelper)
    {
        var widgetControllerInstance = Activator.CreateInstance<T>() as WidgetController;
        return widgetControllerInstance.Index();
    }
}

И назовите это из моей бритвы:

@(Html.RenderWidget<TestWidgetController>())

но вывод:

System.Web.Mvc.ViewResult

Как мне получить html из ActionResult?

1 Ответ

0 голосов
/ 29 апреля 2018

Если вы не делаете что-то очень конкретное, вы можете использовать это для рендеринга HTML в представлении Razor:

@{ Html.RenderAction("Index", "TestWidget", new { }); }

вместо передачи экземпляра Controller с вашим действием контроллера, отформатированным следующим образом:

[ChildActionOnly]
public ActionResult Index()
{
    var viewModel = YourViewModel();
    return PartialView(viewModel);
}

В противном случае, все становится более сложным. С этим вы можете использовать @Html.RenderWidget() в представлении вместо @(Html.RenderWidget<TestWidgetController>()):

public static class WidgetHelper
{
    public static T CreateController<T>(RouteData routeData = null) where T : Controller, new()
    {
        //Ccreate a disconnected controller instance
        T controller = new T();
        // Get context wrapper from HttpContext if available
        HttpContextBase wrapper;
        if (System.Web.HttpContext.Current != null)
        {
            wrapper = new HttpContextWrapper(System.Web.HttpContext.Current);
        }
        else
        {
            throw new InvalidOperationException("Cannot create Controller Context if no active HttpContext instance is available.");
        }

        if (routeData == null)
        {
            routeData = new RouteData();
        }

        // Add the controller routing if not existing
        if (!routeData.Values.ContainsKey("controller") && !routeData.Values.ContainsKey("Controller"))
        {
            routeData.Values.Add("controller", controller.GetType().Name.ToLower().Replace("controller", ""));
        }

        controller.ControllerContext = new ControllerContext(wrapper, routeData, controller);
        return controller;
    }

    public static string ViewToString(ControllerContext context, string viewPath, object model = null, bool partial = false)
    {
        // First find the ViewEngine for this view
        ViewEngineResult viewEngineResult = null;
        if (partial)
        {
            viewEngineResult = ViewEngines.Engines.FindPartialView(context, viewPath);
        }
        else
        {
            viewEngineResult = ViewEngines.Engines.FindView(context, viewPath, null);
        }

        if (viewEngineResult == null)
        {
            throw new FileNotFoundException("View cannot be found.");
        }

        // Get the view and attach the model to view data
        var view = viewEngineResult.View;
        context.Controller.ViewData.Model = model;

        string result = null;

        using (var sw = new StringWriter())
        {
            var ctx = new ViewContext(context, view, context.Controller.ViewData, context.Controller.TempData, sw);
            view.Render(ctx, sw);
            result = sw.ToString();
        }

        return result.Trim();
    }

    public static HtmlString RenderWidget(this HtmlHelper htmlHelper)
    {
        var html = ViewToString(CreateController<Core.Controllers.WidgetController>().ControllerContext, "~/Views/Widget/Index.cshtml", null, true);
        return new HtmlString(html);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...