我对如何实现EditorForModel感到有点困惑。我想到了在Views \ Shared \ EditorTemplates中设置模板的想法,但我认为我已经过度研究(如果可能的话),这导致了我的困惑。
基本上,我正在尝试最小化代码复制。我向客户提供5项服务,每项服务有4到6种不同的解决方案。使事情变得更加复杂,某些类型可以在不同程度上在许多解决方案之间共享。
为简单起见,请选择以下类型:
public string FirstName { get; set; }
我将在每个解决方案中使用它(并在每个服务中上升到“树”)。但很明显,我还有许多其他类型,可以在几个解决方案之间共享,也可以根本不共享。
假设我为每项服务提供100种类型。我可以把它们分开作为不同的View Models,但是我必须通过5种服务来考虑它们。我更愿意将它们全部保存在一个View Model中,每个服务。
当我尝试创建模板时遇到了麻烦。我想使用模板,因为我使用的是向导,我不想在特定解决方案中为向导的每个部分重新创建一个View,特别是如果它是相同的“数据”(并再次考虑到我有多少解决方案)。
因此,我创建了一个BasicDetails.cshtml视图(包含FirstName,LastName和Email等类型),它们实际上可用于所有解决方案。编辑器模板在这里看起来很理想,但我的困惑是因为如果我使用ServiceViewModelOne.cs并执行@ Html.EditorForModel(),我会吐出所有100种类型,或者使用模板只吐出我想要的内容通过在\ Views \ Shared \ EditorTemplates \ ServiceViewModelOne.cshtml中创建模板的BasicDetails.cshtml。
现在,我能够做到以下几点:
@Html.EditorForModel("BasicDetails")
@Html.EditorForModel("WizardStep2")
@Html.EditorForModel("WizardStep3")
对于我想制作的每个自定义模板(无论我想做多少),都使用相同的ServiceViewModelOne.cs?如果我是正确的,那么我将拥有以下文件夹结构:
显然,在每个模板中我都会有相应的
<div class="editor-label">
@Html.LabelFor(m => m.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(m => m.FirstName)
@Html.ValidationMessageFor(m => m.FirstName)
</div>
...
用于向导中该步骤的所有HTML输入(包括整个HTML布局)
这是一种合适的方式来做我想做的事情,还是我在咆哮错误的树?
更新 我想过使用UIHint,但我不确定它是否能完全运行。
我可以在模型级别使用UIHint:
[UIHint("BasicDetails")]
public class MyModel {}
或在类型级别
public class MyModel
{
[UIHint("FirstName")]
public string FirstName { get; set; }
}
我可以创建一个MyModel.cs,然后将其中的一些类型自动映射到MyViewModelOne.cs,MyViewModelTwo.cs等。
然而,我想我会结束自己的拳击,可以这么说。
假设我有Type1,Type2,Type3,Type4。 Type1可用于每个解决方案(保持简单,假设有4个解决方案)。 Type2和Type3可以在一个解决方案中使用,但不能在其他解决方案中使用。并且我们可以说在另一个解决方案中我可以使用Type2和Type4。
使用UIHint或自动化意味着我必须创建3个不同的东西来解决上述问题,如果我需要在另一个解决方案中使用Type3和Type4,该怎么办。
我可能会离开基地,但它似乎只是限制性地迫使我创建多个排列,这是我希望避免的。
我承认没有使用过AutoMapper,我正在研究这是否会有所帮助。
答案 0 :(得分:1)
由于你问题的复杂性,它有点令人困惑,但我会采取刺。
编辑器模板以两种方式处理约定 - 文件名称需要与模型名称匹配,模板类型需要与模型类型匹配。
因此,如果您有多个具有不同名称的类,但是您想要使用单个模板,那么它将不起作用。
我可以看到几个选项。
[UIHint]
指定模板的名称。我强烈建议选择2(如果可能的话)。再次,不确定我是否理解你的问题。
答案 1 :(得分:0)
更新(答案) 我想出了如何处理这个问题,如果这对其他人有用,我会发布一个答案。 就我的目的而言,这有助于极大地提供许多可能性,同时坚持DRY(有些),因为拥有一个模板比拥有相同字段的6个文件更好。
我发布了这个问题,因为我尝试在\ Views \ Shared \ EditorTemplates \ BasicDetails.cshtml中放置一个模板,只是返回了我的所有属性(如FirstName这样的字段),而不是我想要的几个(FirstName,LastName) ,电子邮件)。通常将模板放在\ Shared \文件夹中是正确的做法,如果我有一个模型BasicDetails.cs(例如)。
阅读Brad Wilson's Post中隐藏的评论,我意识到我应该尝试将模板放在
中\ Views {CurrentController} \ EditorTemplates \ BasicDetails.cshtml。
此工作以显示“必填”字段中弹出的视图和验证错误,点击“下一步”或“提交”后,向导会执行其步骤
重申一下,我用了
@Html.EditorForModel("BasicDetails")
其中“BasicDetails”是当前控制器内的模板名称。