MVC:从Controller / Action获取HTML字符串,来自其他控制器的调用

时间:2015-10-30 15:25:45

标签: html asp.net-mvc view render

我有一个控制器:TestController.cs

public ActionResult Test()
{
    return View();        
}

public string TestHtml()
{        
    //Get Result of Test as HTML string
    string HTMLString = "";

    ActionResult AR = Test();
    //Convert AR to HTML string

    HTMLString = ConvertActionResultToHtml(AR);

    //do something with HTMLString

    return HTMLString;
}

Test()函数有一个视图,它返回一段HTML。

当我调用TestHtml()函数时,我希望获得相同的HTML但是作为字符串,所以我需要函数" ConvertActionResultToHtml"。有类似的东西吗?

我知道MVC2mail组件也会这样做,将视图呈现为电子邮件。

当它可以完成时,我希望有一个通用的功能来实现这个目标。喜欢:

public string GetHTMLFromControllerAction(string Controller, string Action) {
    //This function returns the result of a controller action as HTML string
    return ""; //
} 

上面的代码我想从另一个控制器调用。

我尝试了以下代码: How to get view html and return to client side,但无法通过其他控制器功能调用它。

希望有人可以提供帮助,或者可以给我任何关于其他溶剂的提示。

1 个答案:

答案 0 :(得分:0)

您可以使用此方法:

1 st - 你需要在nugget包maneger中安装RazorEngine;

现在您可以使用此代码:

using System;
using System.IO;
using RazorEngine.Configuration;
using RazorEngine.Templating;

namespace Test.ActionAsHtml.Models
{
    public class GetStringFromAction
    {
        private readonly static string _conventionFolderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Views");
        private readonly IRazorEngineService _razorEngineService;

    public GetStringFromAction()
    {
        var templateConfig = new TemplateServiceConfiguration
        {
            TemplateManager = new DelegateTemplateManager(controllerAndAction => File.ReadAllText(Path.Combine(_conventionFolderPath, controllerAndAction))),
            DisableTempFileLocking = true,
            CachingProvider = new DefaultCachingProvider(t => { })
        };
        _razorEngineService = RazorEngineService.Create(templateConfig);
    }
    public string GetHTMLFromControllerAction(string controller, string action, object model)
    {
        //C# 6
        var actionController = $"{controller}/{action}.cshtml";
        //var actionController = string.Format("{0}/{1}.cshtml",controller,action);
        return _razorEngineService.RunCompile(actionController, model.GetType(), model); //
    }
}

}