生成包括asp属性的asp核心特定html代码

时间:2019-02-11 10:19:30

标签: c# html razor asp.net-core reflection

我是Razor的新手,但是经验丰富的经典html和C#。

首先,我完成了Microsoft的razor tutorial。完成之后,我想使用代码,所以我遇到了问题。

我想通过反射创建HTML(this view-code I mean),使视图代码更加动态。将来,我希望通过模型生成完整的html表单,而无需编写html。

有一些类似于以下两个示例的属性块(标题和发布日期):

<div class="form-group">
    <label asp-for="Movie.Title" class="control-label"></label>
    <input asp-for="Movie.Title" class="form-control" />
    <span asp-validation-for="Movie.Title" class="text-danger"></span>
</div>
<div class="form-group">
    <label asp-for="Movie.ReleaseDate" class="control-label"></label>
    <input asp-for="Movie.ReleaseDate" class="form-control" />
    <span asp-validation-for="Movie.ReleaseDate" class="text-danger"></span>
</div>

在C#中,很容易通过反射读取属性并创建html。但是,当我创建html时,无法使用特殊的“ asp-for ”和“ asp-validation-for ”属性。

为了测试服务器端渲染是否支持特殊的“ asp”属性,我在下面创建了硬编码(实验)代码:

@Html.Raw("<div class=\"form-group\">")
@Html.Raw("<label asp-for=\"Movie.Title\" class=\"control-label\"></label>")
@Html.Raw("<input asp-for=\"Movie.Title\" class=\"form-control\" />")
@Html.Raw("<span asp-validation-for=\"Movie.Title\" class=\"text-danger\"></span>")
@Html.Raw("</div>")

正如我期望的那样,对“标题”的验证不再起作用。

我的问题是:

  • 如何通过反射生成asp表单 (或至少有一个Html.Raw吊坠用于此目的?)
  • “ asp”属性在后台如何工作 (编译器是在执行魔术还是在运行时?)

感谢您的努力!

1 个答案:

答案 0 :(得分:1)

asp-*是TagHelper,并且有据可查here,它还向您展示了如何创建自己的。

我想给大家一个有关如何思考Razor页面语法的提示。它是一个模板引擎,因此它进入一个.cshtml页,该扩展名告诉了dotnet core它是一个剃刀文件。并吐出一个html页面,然后将其最终发送到客户端浏览器的响应中(如果您要在客户端上动态更新页面,Razor无法实现这一点,那么它只能在服务器端动态创建页面。)。 / p>

那么dotnet核心如何使用asp-for标签?好吧,它会在html元素上生成html属性,<input asp-for="Model.Prop" />会变成类似<input id="Prop" name="Prop" data-required="" data-maxlength="100" etc... />

因此您可以创建一个自定义属性,将其绑定到<form curstom-attr-bind-model="MyModel"></form>

然后,当请求页面时,将在服务器端构建html页面,并以通用形式实现。

编辑1

我无法告诉您如何通过自定义属性来执行此操作(不过,这让我很感兴趣,我会弄清楚atm,我正在寻找他们如何专门针对select实现其标签辅助程序hereinput元素),但是从短期来看,您可以执行以下操作:

采取的步骤:

  1. 写下:<input asp-for="Form.Number" /> / <span asp-validation-for="Form.Number"></span>
  2. 在浏览器中查看生成了什么html。
  3. 使用Html.Raw()方法模仿它,将为您提供以下类似的东西:@Html.Raw("<input id=\"Form_Number\" name=\"Form.Number\" />")

为什么按自己的方式操作不起作用?因为它将逐行浏览cshtml文件并执行任何C#代码以模板化html。一旦执行@Html.Raw(),它将呈现文本,如果您注意到asp-for="Model.Number"Model.Number不是文本而是对象,即使那样,它也不会递归地重新创建cshtml文件以保持寻找剃刀语法,直到完成。希望这不会造成混淆,只是认为将cshtml转换为html的过程从文件的顶部开始,然后逐步按照说明进行操作,直到到达末尾为止,这应该是有道理的。