我发现了一些文章如何在ASP.NET中将视图返回到字符串,但无法转换为能够使用.NET Core运行它
public static string RenderViewToString(this Controller controller, string viewName, object model)
{
var context = controller.ControllerContext;
if (string.IsNullOrEmpty(viewName))
viewName = context.RouteData.GetRequiredString("action");
var viewData = new ViewDataDictionary(model);
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(context, viewName);
var viewContext = new ViewContext(context, viewResult.View, viewData, new TempDataDictionary(), sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
假设能够使用以下控制器从控制器调用:
var strView = this.RenderViewToString("YourViewName", yourModel);
当我尝试将上述内容运行到.NET Core时,我遇到了很多编译错误 .
我试图将其转换为与.NET Core一起使用,但是失败了,任何人都可以帮助提及 using ..
所需的 using ..
和所需的 "dependencies": { "Microsoft.AspNetCore.Mvc": "1.1.0", ... },
.
NOTE 我需要解决方案将视图转换为.NET Core中的 string
,无论转换的代码是什么,或者是另一种方法 .
7 回答
微软在https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/testing上有一篇关于控制器测试的优秀文章
返回ViewResult后,您可以获取字符串内容
var strResult = ViewResult.Content
感谢Paris Polyzos和他的article .
我在这里重新发布他的代码,以防原始帖子因任何原因被删除 .
在文件
viewToString.cs
中创建Service
,如下代码:Startup.cs
文件中,如下所示:将
"preserveCompilationContext": true
添加到project.json
中的buildOptions
,因此该文件如下所示:model
,例如:Invite.cshtml
例如:Controller
中:一个 . 在开头定义以下内容:
湾使用模型调用并返回视图,如下所示:
C . FULL控制器示例可能如下:
如果像我一样你有许多需要这个的控制器,比如报告网站,重复这个代码并不是很理想,甚至注入或调用另一个服务似乎并不合适 .
所以我已经制作了我自己的上述版本,但有以下不同之处:
模型强类型
查找视图时
错误检查
将视图呈现为部分或页面的能力
asynchronus
实现为控制器扩展
不需要DI
然后执行:
或者这对于PartialView:
上面的答案很好,但需要调整以使任何标记助手工作(我们需要使用实际的http上下文) . 此外,您还需要在视图中显式设置布局以获取呈现的布局 .
我尝试了在@ Dotan Core 2.1中由@Hasan A Yousef回答的解决方案,但是csthml对我不起作用 . 它总是抛出NullReferenceException,见截图 .
为了解决这个问题,我将Html.ViewData.Model分配给一个新对象 . 这是我的代码 .
下面的链接解决了几乎相同的问题:
Where are the ControllerContext and ViewEngines properties in MVC 6 Controller?
在Hasan A Yousef的回答中,我必须进行与上面链接相同的更改,以使其适用于我:
Red的答案让我99%的方式,但如果你的意见在一个意想不到的位置,它不起作用 . 这是我对此的解决方法 .
这允许您使用它,如下所示: