2017-04-03 81 views
0

我已经找过类似的问题,但还没有设法建立解决方案。从字符串呈现剃刀视图

基本上我需要的是从内存中的字符串呈现视图。

例子:

public IActionResult Test() 
    { 
     var model = new MyModel 
     { 
      Name = "Joe" 
     }; 

     var cshtml = "<h1> Hello @Model.Name </h1>"; 

     var myView = MyAwesomeEngine.CreateView(cshtml, model); 

     return View(myView) 
     //or 
     return myView 
    } 

这可能吗?我已经尝试RazorViewEngine继承没有成功,什么是从字符串呈现视图而不查找视图路径中的文件的正确方法?

我使用aspnetcore 1.1

+3

你为什么要那样做? – Legends

+0

我的观点将会被一群可以访问视图的AWS存储桶的人不断修改,他们将能够添加更多视图(因此我的应用程序将列出可用视图的存储桶),所以基本上我会去从存储桶中读取视图并将其缓存到内存中以避免大量S3请求。 – ferflores

+0

或者在我的视图路径上同步存储桶文件的过程会更容易吗? – ferflores

回答

0

由于Legends使用IFileProvider方法建议工作正常!

使用我能做到这link的例子(没有数据库)

这是我的测试IFileInfo实现:

public class MemoryFileInfo : IFileInfo 
    { 
     private byte[] _testContent = Encoding.ASCII.GetBytes(@"@model TestModel 
      <p>@Model.Name</p>"); 

     private string _viewName; 
     public bool Exists { get 
      { 
       return _viewName.Equals("/Views/Home/TestView.cshtml"); 
      } 
     } 

     public MemoryFileInfo(string name) 
     { 
      _viewName = name; 
     } 

     public long Length => _testContent.Length; 

     public string PhysicalPath => null; 

     public string Name => _viewName; 

     public DateTimeOffset LastModified => DateTimeOffset.Now; 

     public bool IsDirectory => false; 

     public Stream CreateReadStream() 
     { 
      return new MemoryStream(_testContent); 
     } 
    } 

这又是一个很好的解决方案RazorEngine但没有支持对于netcoreapp1.1还有