2017-04-03 79 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還有