关键词

教你如何在 Javascript 文件里使用 .Net MVC Razor 语法

接下来我将详细讲解“教你如何在 Javascript 文件里使用 .Net MVC Razor 语法”的完整攻略。

什么是 .Net MVC Razor 语法

Razor 语法是 ASP.NET MVC 3 及其更高版本中引入的一种标记语言,它不仅可以被用于模板引擎,还可以用于编写控制器中的 C# 代码。

Razor 语法结合了 C# 代码与 HTML 标记,它的特点是简单、易读、易懂。.Net MVC Razor 语法用 @@ 符号来表示 @ 符号本身,用 @{} 来表示代码块。

如何在 Javascript 文件中使用 .Net MVC Razor 语法

想要在 Javascript 文件中使用 .Net MVC Razor 语法,我们需要使用封装 Razor 语法的函数,并且传递必要的参数和数据。

以下是实现 .Net MVC Razor 语法在 Javascript 文件中使用的步骤:

  1. App_Start 文件夹下建立一个名为 RazorConfig.cs 的文件,并将以下代码放入其中:
using System.CodeDom.Compiler;
using System.Web.Razor;

namespace YourNamespace
{
    public class RazorConfig
    {
        public static void RegisterRazorViewEngine()
        {
            var engine = new RazorViewEngine();
            engine.CodeGenerationOptions
                .AddImports("System.Linq")
                .AddImports("System.Linq.Expressions");

            var host = new RazorEngineHost(new CSharpRazorCodeLanguage())
            {
                DefaultBaseClass = typeof(System.Web.Mvc.WebViewPage<>).FullName,
                DefaultNamespace = "ASP",
                GeneratedCodeNamespace = "ASP",
                GeneratedCodeDirectory = "your_generated_code_directory",
                UsePhysicalViewsIfNewer = true
            };

            host.NamespaceImports.Add("System.Web.Mvc");
            host.NamespaceImports.Add("System.Web.Mvc.Html");

            var viewPageActivator = new RazorViewPageActivator();
            var page = engine.FindView(new RequestContext(), "your_view", "", false).View;

            page.InitializePage(new WebPageBaseDependencyResolver(), HttpContext.Current, null);
            page.PageContext = new WebPageContext(HttpContext.Current, page, null);
            page.PageData = new ViewDataDictionary();
            page.Url = new UrlHelper(HttpContext.Current.Request.RequestContext);

            var generatorResults = GenerateCode(host, page);

            page.Execute();

            string js = new RazorJSGenerator().Generate(generatorResults.Code).ToString();

            // 你的 Razor 模板在 JS 文件中的执行方式
            // 可使用 eval()、原生的 jQuery compilify(jsrender 等),或类 coffeescript 的 (->)()
            System.IO.File.WriteAllText("your_js_file.js", js);
        }

        static GeneratorResults GenerateCode(RazorEngineHost host, WebPageBase page)
        {
            var generator = new RazorCodeGenerator(host);
            var razorResult = generator.GenerateCode(page);
            var compilerParameters = new CompilerParameters
            {
                GenerateInMemory = true,
                IncludeDebugInformation = true
            };
            compilerParameters.ReferencedAssemblies.Add("System.dll");
            compilerParameters.ReferencedAssemblies.Add("System.Core.dll");
            compilerParameters.ReferencedAssemblies.Add("System.Web.Mvc.dll");
            compilerParameters.ReferencedAssemblies.Add("System.Web.dll");
            compilerParameters.ReferencedAssemblies.Add(page.GetType().Assembly.Location);

            var csc = new CSharpCodeProvider();
            var compileResult = csc.CompileAssemblyFromDom(compilerParameters, razorResult.GeneratedCode);

            return new GeneratorResults(razorResult, compileResult);
        }

        public class RazorJSGenerator : RazorJSGeneratorBase
        {
            internal override string ResolveEventHandlerScript(MethodOfGettingHandler script, object[] args)
            {
                var body = base.ResolveEventHandlerScript(script, args)
                    .Replace("<text>", "document.write(")
                    .Replace("</text>", ")");

                if (body.Trim().StartsWith("document.write("))
                    return body;

                return "document.write(" + body + ")";
            }
        }
    }
}
  1. 将以下代码添加到 Global.asax 文件的 Application_Start 方法中:
RazorConfig.RegisterRazorViewEngine();
  1. 在需要的视图文件中编写你的 Razor 模板,模板中的 Javascript 代码需要以 @@ 符号开头:
@apphelpers(){}


<script>
    // 需要在 JS 文件中使用的 Razor 语法
    var result = @(Model.Whatever);
</script>
  1. 编译完整个项目后,就可以找到 .js 文件并运行了。

示例

示例1

在需要让 Javascript 文件获取动态数据的情况下,我们可以将数据存储在视图模型中,并在 Razor 模板中调用需要传递的数据。

在视图文件中:

@model MyNamespace.ViewModels.MyViewModel

<script type="text/javascript" src="~/Scripts/my-js-file.js" ></script>

<script>
    var myData = @Html.Raw(Json.Encode(Model.MyData));
</script>

在 Javascript 文件中:

(function($) {
    $(document).ready(function() {

        // 使用从 Razor 模板传递的数据
        var data = myData;
        alert(data);

    });

})(jQuery);

示例2

在 Javascript 文件中需要动态生成 HTML 代码时,我们可以使用 Razor 模板来实现。

在视图文件中:

<div id="my-container"></div>

<script type="text/javascript" src="~/Scripts/my-js-file.js" ></script>

<script type="text/javascript">
    // 模板中的数据
    var data = [
        { title: "Title1", content: "Content1" },
        { title: "Title2", content: "Content2" },
        { title: "Title3", content: "Content3" },
    ];

    // 渲染模板并添加到页面中
    var myTemplate = @(Html.Raw(YourNamespace.JsTemplates.MyTemplate()));
    $("#my-container").html(myTemplate(data));
</script>

在 Javascript 文件中:

var YourNamespace = YourNamespace || {};

YourNamespace.JsTemplates = YourNamespace.JsTemplates || {};

YourNamespace.JsTemplates.MyTemplate = function() {

    var template = '@{'
        + '  var result = "";'
        + '  for (var i = 0; i < Model.length; i++) {'
        + '      result += "<div class=\"item\">";'
        + '      result += "<h2>" + Model[i].title + "</h2>";'
        + '      result += "<p>" + Model[i].content + "</p>";'
        + '      result += "</div>";'
        + '  }'
        + '  WriteLiteral(result);'
        + '}';

    return template;
};

以上示例展示了如何在 Javascript 文件中使用 Razor 语法,实现了从 Razor 模板中获取动态数据,以及使用 Razor 模板动态生成 HTML 代码的功能。

本文链接:http://task.lmcjl.com/news/11828.html

展开阅读全文