C# 如何使razor模板中的html助手更加可重用?

C# 如何使razor模板中的html助手更加可重用?,c#,asp.net-mvc-3,razor,C#,Asp.net Mvc 3,Razor,我有一张有多个地址的表格。业务地址、账单地址和发货地址。当然,我想使用相同的代码 我的剃须刀模板如下所示: <div class="std-form-line"> <span class="std-form-no-label"></span> @Html.TextBoxFor(x => x.BillingAddress.Line2, new { Class = "optional" }) @Html.ValidationMessa

我有一张有多个地址的表格。业务地址、账单地址和发货地址。当然,我想使用相同的代码

我的剃须刀模板如下所示:

<div class="std-form-line">
    <span class="std-form-no-label"></span>
    @Html.TextBoxFor(x => x.BillingAddress.Line2, new { Class = "optional" })
    @Html.ValidationMessageFor(x => x.BillingAddress.Line2)
</div>
<div class="std-form-line">
    <span class="std-form-no-label"></span>
    @Html.TextBoxFor(x => x.BillingAddress.Line3, new { Class = "optional" })
    @Html.ValidationMessageFor(x => x.BillingAddress.Line3)
</div>
....
<input type="text" value="" name="BillingAddress.Line1" id="BillingAddress_Line1" data-val-required="The Street Address field is required." data-val="true" class="text-box single-line">
<div class="std-form-line">
    <span class="std-form-no-label"></span>
      @Html.TextBoxFor(x => x.BusinessAddress.Line2, new { Class = "optional" })
</div>
<div class="std-form-line">
    <span class="std-form-no-label"></span>
      @Html.TextBoxFor(x => x.BusinessAddress.Line3, new { Class = "optional" })
</div>

@TextBoxFor(x=>x.BillingAddress.Line2,新的{Class=“optional”})
@Html.ValidationMessageFor(x=>x.BillingAddress.Line2)
@TextBoxFor(x=>x.BillingAddress.Line3,新的{Class=“optional”})
@Html.ValidationMessageFor(x=>x.BillingAddress.Line3)
....
当渲染时,看起来像这样:

<div class="std-form-line">
    <span class="std-form-no-label"></span>
    @Html.TextBoxFor(x => x.BillingAddress.Line2, new { Class = "optional" })
    @Html.ValidationMessageFor(x => x.BillingAddress.Line2)
</div>
<div class="std-form-line">
    <span class="std-form-no-label"></span>
    @Html.TextBoxFor(x => x.BillingAddress.Line3, new { Class = "optional" })
    @Html.ValidationMessageFor(x => x.BillingAddress.Line3)
</div>
....
<input type="text" value="" name="BillingAddress.Line1" id="BillingAddress_Line1" data-val-required="The Street Address field is required." data-val="true" class="text-box single-line">
<div class="std-form-line">
    <span class="std-form-no-label"></span>
      @Html.TextBoxFor(x => x.BusinessAddress.Line2, new { Class = "optional" })
</div>
<div class="std-form-line">
    <span class="std-form-no-label"></span>
      @Html.TextBoxFor(x => x.BusinessAddress.Line3, new { Class = "optional" })
</div>

现在假设我将有相同的代码,用于商业和运输,但它将如下所示:

<div class="std-form-line">
    <span class="std-form-no-label"></span>
    @Html.TextBoxFor(x => x.BillingAddress.Line2, new { Class = "optional" })
    @Html.ValidationMessageFor(x => x.BillingAddress.Line2)
</div>
<div class="std-form-line">
    <span class="std-form-no-label"></span>
    @Html.TextBoxFor(x => x.BillingAddress.Line3, new { Class = "optional" })
    @Html.ValidationMessageFor(x => x.BillingAddress.Line3)
</div>
....
<input type="text" value="" name="BillingAddress.Line1" id="BillingAddress_Line1" data-val-required="The Street Address field is required." data-val="true" class="text-box single-line">
<div class="std-form-line">
    <span class="std-form-no-label"></span>
      @Html.TextBoxFor(x => x.BusinessAddress.Line2, new { Class = "optional" })
</div>
<div class="std-form-line">
    <span class="std-form-no-label"></span>
      @Html.TextBoxFor(x => x.BusinessAddress.Line3, new { Class = "optional" })
</div>

@Html.TextBoxFor(x=>x.BusinessAddress.Line2,新的{Class=“optional”})
@Html.TextBoxFor(x=>x.BusinessAddress.Line3,新的{Class=“optional”})

如何消除这种代码重复?

我的方法是为“地址”创建强类型的显示/编辑器模板

然后调用
@Html.EditorFor(x=>x.BusinessAddress)
@Html.DisplayFor(x=>x.BusinessAddress)

您还可以为不同的用途创建不同的模板,然后在Editor/DisplayFor方法中可选地提供模板的名称

顺便说一句,我提到的模板可能分别位于~Views/Shared/EditorTemplates或~Views/Shared/DisplayTemplates文件夹中。或者它们可能位于特定的控制器视图文件夹中的EditorTemplates或DisplayTemplates下

编辑:这里有一个链接演示了这一点。

编辑2:下面是一个示例,根据您的评论尝试进一步解释

地址模型

编辑器模板:该文件名为“Address.cshtml”,位于我的“~Views/Shared/EditorTemplates”文件夹中

现在,如果我的视图模型是其他链接到“地址”的模型,我会使用
@Html.EditorFor(model=>model.BusinessAddress)


至于名字,那完全在你的控制之下。默认情况下,它们会映射到您的属性名称,但您可以通过在
EditorFor
重载中提供包含html属性的对象来更改任何属性。

我这样做的方式是为“地址”创建强类型显示/编辑器模板

然后调用
@Html.EditorFor(x=>x.BusinessAddress)
@Html.DisplayFor(x=>x.BusinessAddress)

您还可以为不同的用途创建不同的模板,然后在Editor/DisplayFor方法中可选地提供模板的名称

顺便说一句,我提到的模板可能分别位于~Views/Shared/EditorTemplates或~Views/Shared/DisplayTemplates文件夹中。或者它们可能位于特定的控制器视图文件夹中的EditorTemplates或DisplayTemplates下

编辑:这里有一个链接演示了这一点。

编辑2:下面是一个示例,根据您的评论尝试进一步解释

地址模型

编辑器模板:该文件名为“Address.cshtml”,位于我的“~Views/Shared/EditorTemplates”文件夹中

现在,如果我的视图模型是其他链接到“地址”的模型,我会使用
@Html.EditorFor(model=>model.BusinessAddress)


至于名字,那完全在你的控制之下。默认情况下,它们会映射到您的属性名称,但您可以通过在
编辑器中为
重载提供包含html属性的对象来更改任何属性。

我看不到任何重复项可以从枯燥的意义上消除。如果表单上有3个相似的字段,则标记中需要3个相似的元素。

我看不到任何重复项可以从枯燥的意义上消除。如果表单上有3个类似的字段,则标记中需要3个类似的元素。

为什么不引入AddressType字段?您提到的所有3种地址类型共享相同的字段,只是它们的类型不同;设置每个appart的是AddressType的值。有意义吗?

为什么不引入AddressType字段?您提到的所有3种地址类型共享相同的字段,只是它们的类型不同;设置每个appart的是AddressType的值。有意义吗?

我将尝试回答,但我认为您需要查看和编辑示例代码。它目前不符合您的叙述。我将尝试回答,但我认为您需要检查和编辑您的示例代码。它目前不符合您的叙述。好吧,我将创建一个BusinessAddress模型,扩展一个地址模型,然后为地址创建一个编辑器模板。每个输入的name属性是否会以不同的方式命名,以便使用MVC3 TryValidateModel对其进行验证?好的,我将创建一个扩展地址模型的BusinessAddress模型,然后为地址创建一个编辑器模板。每个输入的name属性是否会以不同的方式命名,以便使用MVC3 TryValidateModel对其进行验证?