zoukankan      html  css  js  c++  java
  • RazorEngine.Templating MVC中View当模板

    最近在做一个生成JSON的功能,比较笨的办法就是把需要的数据拆分开,保存到数据库,在从数据库中取出来进行拼接。这种方法比较笨,代码就不贴了。

    需要注意拼接的时的转义字符:

    ""smallChapter"" + ":" +"""
    

      后来想用T4模板生成,但是有个把数据当参数传递的过程,没有克服。把没有克服的代码贴出来,有大神知道的话,可以帮忙解决。(host报错)

    public class Testt4
        {
            public class CustomTextTemplatingEngineHost : ITextTemplatingEngineHost, ITextTemplatingSessionHost
            {
    
                internal string TemplateFileValue;
                public string TemplateFile
                {
                    get { return TemplateFileValue; }
                }
    
                private string fileExtensionValue = ".txt";
                public string FileExtension
                {
                    get { return fileExtensionValue; }
                }
    
                private Encoding fileEncodingValue = Encoding.UTF8;
                public Encoding FileEncoding
                {
                    get { return fileEncodingValue; }
                }
                private CompilerErrorCollection errorsValue;
                public CompilerErrorCollection Errors
                {
                    get { return errorsValue; }
                }
                public IList<string> StandardAssemblyReferences
                {
                    get
                    {
                        return new string[]
                        {
                        typeof(System.Uri).Assembly.Location
                        };
                    }
                }
                public IList<string> StandardImports
                {
                    get
                    {
                        return new string[]
                        {
                        "System"
                        };
                    }
                }
    
                public bool LoadIncludeText(string requestFileName, out string content, out string location)
                {
                    content = System.String.Empty;
                    location = System.String.Empty;
    
                    if (File.Exists(requestFileName))
                    {
                        content = File.ReadAllText(requestFileName);
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
    
                public object GetHostOption(string optionName)
                {
                    object returnObject;
                    switch (optionName)
                    {
                        case "CacheAssemblies":
                            returnObject = true;
                            break;
                        default:
                            returnObject = null;
                            break;
                    }
                    return returnObject;
                }
    
                public string ResolveAssemblyReference(string assemblyReference)
                {
                    if (File.Exists(assemblyReference))
                    {
                        return assemblyReference;
                    }
    
                    string candidate = Path.Combine(Path.GetDirectoryName(this.TemplateFile), assemblyReference);
                    if (File.Exists(candidate))
                    {
                        return candidate;
                    }
                    return "";
                }
    
                public Type ResolveDirectiveProcessor(string processorName)
                {
                    if (string.Compare(processorName, "XYZ", StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        //return typeof();
                    }
                    throw new Exception("Directive Processor not found");
                }
    
                public string ResolvePath(string fileName)
                {
                    if (fileName == null)
                    {
                        throw new ArgumentNullException("the file name cannot be null");
                    }
                    if (File.Exists(fileName))
                    {
                        return fileName;
                    }
                    string candidate = Path.Combine(Path.GetDirectoryName(this.TemplateFile), fileName);
                    if (File.Exists(candidate))
                    {
                        return candidate;
                    }
                    return fileName;
                }
    
                public string ResolveParameterValue(string directiveId, string processorName, string parameterName)
                {
                    if (directiveId == null)
                    {
                        throw new ArgumentNullException("the directiveId cannot be null");
                    }
                    if (processorName == null)
                    {
                        throw new ArgumentNullException("the processorName cannot be null");
                    }
                    if (parameterName == null)
                    {
                        throw new ArgumentNullException("the parameterName cannot be null");
                    }
                    return String.Empty;
                }
    
                public void SetFileExtension(string extension)
                {
                    fileExtensionValue = extension;
                }
    
                public void SetOutputEncoding(System.Text.Encoding encoding, bool fromOutputDirective)
                {
                    fileEncodingValue = encoding;
                }
    
                public void LogErrors(CompilerErrorCollection errors)
                {
                    errorsValue = errors;
                }
    
                //public AppDomain ProvideTemplatingAppDomain(string content)
                //{
                //    return AppDomain.CreateDomain("Generation App Domain");
                //}
    
                public ITextTemplatingSession CreateSession()
                {
                    return Session;
                }
    
                public ITextTemplatingSession Session
                {
                    get;
                    set;
                }
    
                //https://blog.csdn.net/danielchan2518/article/details/51019083
    
                public AppDomain ProvideTemplatingAppDomain(string content)
                {
                    //Assembly myAssembly = Assembly.GetAssembly(this.GetType());
                    //string assemblePath = myAssembly.Location.Substring(0, myAssembly.Location.LastIndexOf("\"));
                    //AppDomainSetup ads = new AppDomainSetup()
                    //{
                    //    ApplicationName = "Generation App Domain",
                    //    ApplicationBase = assemblePath,
                    //    DisallowBindingRedirects = false,
                    //    DisallowCodeDownload = true,
                    //    ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
                    //};
                    //AppDomain domain = AppDomain.CreateDomain("Generation App Domain", null, ads);
                    //return domain;
                    return AppDomain.CurrentDomain;
                }
    
      
            
    
            }
    
            public static void TestT4()
            {
                CustomTextTemplatingEngineHost host = new CustomTextTemplatingEngineHost();
                string filePath = @"E:editsoft	4.txt";
                host.TemplateFileValue = filePath;
                string input = File.ReadAllText(filePath);
    
    //            string input = @"
    //<#@template debug=""false"" hostspecific=""false"" language=""C#""#>
    //<#@ output extension="".txt"" encoding=""utf-8"" #>
    //<#@ parameter type=""Demo_T4.People"" name=""hzx"" #>
    //Name:<#= hzx.Name #>  Age:<#= hzx.Age #>   Sex:<#= hzx.Sex #>
    //            ";
    
                host.Session = new TextTemplatingSession();
                host.Session.Add("hzx", new People("韩兆新", 24, "男"));
    
                string output = new Engine().ProcessTemplate(input, host);
                Console.WriteLine(output);
    
    
                StringBuilder errorWarn = new StringBuilder();
                foreach (CompilerError error in host.Errors)
                {
                    errorWarn.Append(error.Line).Append(":").AppendLine(error.ErrorText);
                }
                Console.WriteLine( errorWarn.ToString());
    
            }
        }
    
        [Serializable]
        public class People
        {
            public People(string name, uint age, string sex)
            {
                this.Name = name;
                this.Age = age;
                this.Sex = sex;
            }
            public string Name
            { set; get; }
            public uint Age
            { set; get; }
            public string Sex
            { set; get; }
        }
    

      最后想到了MVC 的视图Rezor,当模板具体代码如下:

    在控制器中写方法:通过写一个Ajax跳入这个方法

     public ActionResult GetDataJson()
    {
                string url = Request.Url.ToString(); //获取参数
                string bid = Request.QueryString[""];
                string cid = Request.QueryString[""];
            //获取数据定义成集合
               ArrayList arry = GenerateJsonData();
               ArrayList arrTitle = GetTile();
              ArrayList arrlanmu = GetLanMuContent();

                         var config = new TemplateServiceConfiguration();
                          GetData(arry, arrTitle, arrlanmu, config);

      GetData方法:

     private void GetData(ArrayList arry, ArrayList arrTitle, ArrayList arrlanmu, TemplateServiceConfiguration config)
            {
                using (var service = RazorEngine.Templating.RazorEngineService.Create(config))
                {
                    var model = new { arrTitle, arry, arrlanmu };
    
                    //获取视图的路径
                    string templateFile = Server.MapPath("~/Views/ResolveTemplateJson/PhysicsJson.cshtml");
                    //打开文件的内容
                    string templateContent = System.IO.File.ReadAllText(templateFile, System.Text.Encoding.UTF8);
                    //返回视图中的结果
                    string results = service.RunCompile(templateContent, string.Empty, null, model);
                    //把结构中的特殊字符进行处理
                    results = results.Replace("<", "<").Replace(">", ">")
                       .Replace("&", "&").Replace("'", "'").Replace(""", """);
    
                    string filePath = GetFilePath();
    
                     GetWriteValue(results, filePath);
    
                    //写入txt中
                    // string outputTextFile = @"d:	emp.txt";
                    // System.IO.File.WriteAllText(outputTextFile, results);
                }
            }
    GetFilePath
    private string GetFilePath()
            {
                string filePath = "";
                if (Session["chapterNum"] != null)
                {
                    int zhang = Convert.ToInt32(Session["chapterNum"]);
                    int jie = Convert.ToInt32(Session["sectionNum"]);
                    int xiaojie = Convert.ToInt32(Session["smallSectionNum"]);
                    string jcName = Session["jcName"].ToString();
                    string xkName = Session["xkName"].ToString();
                    string NjName = Session["NjName"].ToString();
                    string gradeTerm = Session["gradeTerm"].ToString();
                    string webConfigFilePath = ConfigurationManager.AppSettings["FilePathConnectionString"].ToString();
                    filePath = string.Format(webConfigFilePath + "{0}{1}{2}{3}/{4:00}/{5:00}{6:00}/",
                NjName, xkName, jcName, gradeTerm, zhang, jie, xiaojie);
                }
    
                return filePath;
            }
    GetWriteValue()
    private void GetWriteValue(string results, string filePath)
            {
                string webMapFilePath = ConfigurationManager.AppSettings["FilePath"].ToString();
                string Path = Server.MapPath(webMapFilePath + filePath);
                if (!Directory.Exists(Path))
                {
                    Directory.CreateDirectory(Path);
                }
                string FileName = "bookData";
    
                if (!System.IO.File.Exists(Path + FileName + ".js"))
                {
                    FileStream fsCreate = new FileStream(Path + FileName + ".js", FileMode.Create, FileAccess.Write);//创建写入文件 
                    StreamWriter sw = new StreamWriter(fsCreate);
                    sw.WriteLine(results);//开始写入值
                    sw.Close();
                    fsCreate.Close();
                }
                else
                {
                    FileStream fsCreate = new FileStream(Path + FileName + ".js", FileMode.Create, FileAccess.Write);//创建写入文件 
                    StreamWriter sw = new StreamWriter(fsCreate);
                    sw.WriteLine(results);//开始写入值
                    sw.Close();
                    fsCreate.Close();
                }
            }
    

      跳转视图的Ajax:

    function ResolveTemplateJson() {
            var url = "/ResolveTemplateJson/GetDataJson/?csid=@ViewData[""]&bid=@ViewData[""]";
            $.ajax({
                url: url,
                type: "POST",
                success: function (data) {
                    if (data == "ok") {
                        alert("保存成功!!");
                        window.location.href = "/UEditor/Index/?csid=@ViewData[""]&bid=@ViewData[""]";
                    } else if (data == "error") {
                        alert("保存失败");
                    }
                }
            });
        }
    

      视图的代码:

    @for (int i = 0; i < Model.arrTitle.Count; i++)
    {
        if (Model.arrTitle[i].titles != null)
        {
            @:{
            @:"smallChapter": "@Model.arrTitle[i].titles",
            @:"isActive":false,
            @://当前用户选择的小节
            @:"ifstudy":false
            @:},
        }
    }
    ],
     //全解版的内容
     "content":  [
     //第一小节的内容 一小结有n个知识点 知识点里面包含小知识点
    @for (int j = 0; j < Model.arrlanmu.Count; j++)
    {
        @:{
        @:"id":"@Model.arrlanmu[j].id",
        @:"knowledge":"@Model.arrlanmu[j].knowledge",
        @:"process":
        @:"Introduction":"@Model.arrlanmu[j].Introduction",
        for (int m = 0; m < Model.arry.Count; m++)
        {
            if (@Model.arrlanmu[j].id == @Model.arry[m].id)
            {
                @:smallKnowledge:[{
                     @:"id":"@Model.arry[m].smallID",
                     @:"fullVersion":[
                     @:"type":"textIntroduction",
                     @:"smalltitle":"@Model.arry[m].smallTitle",
                     @:"content":"@Model.arry[m].smallContent",
                     @:},
                     @Model.arry[m].smallSubjectJson
                     @:],
                     @:}
                @:]
            }
        }
    
    
        @:}
    }
    

      

      引入的命名空间:

    using RazorEngine.Configuration;
    using RazorEngine.Templating;
    

      Negut安装:

  • 相关阅读:
    2019年主机游戏将走下坡路
    关于敏捷开发的26个心得
    CSS3弹性布局内容对齐(justify-content)属性使用具体解释
    (cLion、RubyMine、PyCharm、WebStorm、PhpStorm、Appcode、Clion、Idea) 万能破解,获取自己的注冊码
    hdoj-1212-Big Number【大数取余&amp;简单题】
    gitlab https
    gitlab smtp设置
    GitLab: API is not accessibl
    Could not find modernizr-2.6.2 in any of the sources GitLab: API is not accessible
    gitlab
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/9078925.html
Copyright © 2011-2022 走看看