別の方法でカミソリ・ビュー・エンジンを使用して
-
25-09-2019 - |
質問
私は、差し込み印刷技術などの新しいMVCかみそりビューエンジンを使用することができれば、それは興味深いものになるだろうと思いました。それはまだMVCのウェブサイトの一部にすることができ、スタンドアロンのコンソールアプリケーションである必要はありません。
例:
string myTemplate = "Hello @Name, How are you today?";
ViewModel.Name = "Billy Boy";
string output = RazorViewEngineRender( myTemplate, ViewModel );
次にstring output = "Hello Billy Boy, How are you today?"
主なものは、私はテンプレートが文字列ではなく、ビューまたはpartialviewから駆動されるようにしたいです。
んの誰も知っている、これは可能ですか?
UPDATE:
ベンとマットは、CodePlexの上でプロジェクトを作った: http://razorengine.codeplex.com/する
解決
警告
このは、それが正常に動作してき以外のそれをテストすることなく、一緒にハッキングされたいくつかの醜い醜いコードです。
VirtualPathProvider
私達は私達が私達の動的に生成されたテンプレートを取得するMVCを伝えるために私たち自身のパスプロバイダを追加する必要があり、サーバー上の実際の見解を扱っていないので、。ビューが追加されているかどうかを確認するために、文字列辞書をチェックするようなより多くのテストがあるはずです。
public class StringPathProvider : VirtualPathProvider {
public StringPathProvider()
: base() {
}
public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) {
return null;
}
public override bool FileExists(string virtualPath) {
if (virtualPath.StartsWith("/stringviews") || virtualPath.StartsWith("~/stringviews"))
return true;
return base.FileExists(virtualPath);
}
public override VirtualFile GetFile(string virtualPath) {
if (virtualPath.StartsWith("/stringviews") || virtualPath.StartsWith("~/stringviews"))
return new StringVirtualFile(virtualPath);
return base.GetFile(virtualPath);
}
public class StringVirtualFile : System.Web.Hosting.VirtualFile {
string path;
public StringVirtualFile(string path)
: base(path) {
//deal with this later
this.path = path;
}
public override System.IO.Stream Open() {
return new System.IO.MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(RazorViewEngineRender.strings[System.IO.Path.GetFileName(path)]));
}
}
}
レンダリングクラス
このクラスは、コンストラクタのパラメータとしてテンプレートを取り、その後、上記のVirtualPathProvider
によって読み取られる静的辞書に追加します。その後、Render
を呼び出し、必要に応じてモデルに渡すことができます。これは、そのファイルの内容に@inherits
と付加する完全修飾されたモデルタイプを追加します。
public class RazorViewEngineRender {
internal static Dictionary<string, string> strings { get; set; }
string guid;
static RazorViewEngineRender() {
strings = new Dictionary<string, string>();
}
public RazorViewEngineRender(string Template) {
guid = Guid.NewGuid().ToString() + ".cshtml";
strings.Add(guid, Template);
}
public string Render() {
return Render(null);
}
public string Render(object ViewModel) {
//Register model type
if (ViewModel == null) {
strings[guid] = "@inherits System.Web.Mvc.WebViewPage\r\n" + strings[guid];
} else {
strings[guid] = "@inherits System.Web.Mvc.WebViewPage<" + ViewModel.GetType().FullName + ">\r\n" + strings[guid];
}
CshtmlView view = new CshtmlView("/stringviews/" + guid);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
System.IO.TextWriter tw = new System.IO.StringWriter(sb);
ControllerContext controller = new ControllerContext();
ViewDataDictionary ViewData = new ViewDataDictionary();
ViewData.Model = ViewModel;
view.Render(new ViewContext(controller, view, ViewData, new TempDataDictionary(), tw), tw);
//view.ExecutePageHierarchy();
strings.Remove(guid);
return sb.ToString();
}
}
Global.asaxの
あなたのGlobal.asaxファイルでは、Application_Start
System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(new Controllers.StringPathProvider());
コードを呼び出します
string Template = "Hello, @Model.Name";
Models.User user = new Models.User() { Name = "Billy Boy" };
RazorViewEngineRender view = new RazorViewEngineRender(Template);
string Results = view.Render(user); //pass in your model
注意
こののみ型指定されたモデルで動作します。私は、新しい{NAME =「ビリー・ボーイ」}に渡そうとしましたし、それがエラーを投げています。私は確かになぜ、実際にそれにあまりにも深く見ていないではないです。
これは楽しかった、この質問をしていただきありがとうございます。
他のヒント
はカミソリを念頭に置いて、スタンドアロン操作で設計されました。そのモードについての多くのドキュメントはまだありません(それはまだ開発中のすべてなので)が、アンドリュー・ナースによって、このブログの記事を見てい<のhref = "http://vibrantcode.com/blog/2010/7/22を/using-the-razor-parser-outside-of-aspnet.html」のrel = "nofollowを"> http://vibrantcode.com/blog/2010/7/22/using-the-razor-parser-outside-of -aspnet.htmlする