有没有办法创建像“文本”这样的自定义MVC Razor元素?

时间:2014-10-15 14:44:27

标签: asp.net-mvc razor razorengine

我想创建一个自定义的剃刀标记,如<text></text>,以决定如何处理其中的html代码。有没有办法创建像<text></text>元素这样的剃刀元素并将其添加到剃刀引擎中?

我不想为此创建任何HtmlHelper。

对于考试:

<WYSYWIG>
Hello There!
</WYSYWIG>

<WeatherChart City="NY">
</WeatherChart>

解释

好的想法是通过给定的属性将服务器标签翻译(解析)为html代码。这种代码有助于初级开发人员不要参与控制的复杂性。

2 个答案:

答案 0 :(得分:1)

与您描述的最接近的是创建显示或编辑器模板。然后,您可以为模型定义模板,并在视图中将其与@Html.DisplayFor()一起使用。

这是一篇很好的博文,旨在帮助您入门aspnet mvc display and editor templates,并快速概述下面的结构。

示例

模型 - WeatherChartModel.cs

public class WeatherChartModel 
{
}

显示模板 - WeatherChart.cshtml

<div class="weather-chart">
   // Some other stuff here
</div>

查看 - Index.cshtml

@model WeatherChartModel

@Html.DisplayForModel() // This will output the template view for the model

答案 1 :(得分:0)

为了在剃刀中创建自定义元素处理,例如<text>,您需要实现自定义System.Web.Razor.dll(负责解析文档)。具体来说,您要重新实现的课程是System.Web.Razor.Parser.HtmlMarkupParser

但是,鉴于框架本身的灵活性,我认为这不是必要的。如果您希望保持模块化,请查看使用DisplayTemplates / EditorTemplates或考虑编写自己的扩展方法。例如,以下任何一种都更理想:

@* TextField is decorated with UIHint("WYSIWYG"), therefore
   calling ~/Views/Shared/EditorTemplates/WYSIWYG.cshtml *@
@Html.EditorFor(x => x.TextField)

@* WeatherField is decorated with UIHint("WeatherChart"), therefore
   calling ~/Views/Shared/DisplayTemplates/WeatherChart.cshtml *@
@Html.DisplayFor(x => x.WeatherField)

可替换地:

@* Custom extension method *@
@Html.WysiwygFor(x => x.TextField)

@* Another custom extension method *@
@Html.WeatherChartFor(x => x.WeatherField)