接下来我将详细讲解“教你如何在 Javascript 文件里使用 .Net MVC Razor 语法”的完整攻略。
Razor 语法是 ASP.NET MVC 3 及其更高版本中引入的一种标记语言,它不仅可以被用于模板引擎,还可以用于编写控制器中的 C# 代码。
Razor 语法结合了 C# 代码与 HTML 标记,它的特点是简单、易读、易懂。.Net MVC Razor 语法用 @@ 符号来表示 @ 符号本身,用 @{} 来表示代码块。
想要在 Javascript 文件中使用 .Net MVC Razor 语法,我们需要使用封装 Razor 语法的函数,并且传递必要的参数和数据。
以下是实现 .Net MVC Razor 语法在 Javascript 文件中使用的步骤:
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 + ")";
}
}
}
}
Global.asax
文件的 Application_Start
方法中:RazorConfig.RegisterRazorViewEngine();
@apphelpers(){}
<script>
// 需要在 JS 文件中使用的 Razor 语法
var result = @(Model.Whatever);
</script>
.js
文件并运行了。在需要让 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);
在 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