2012-02-06 35 views
0

我对如何实现EditorForModel有点困惑。我得到了在Views \ Shared \ EditorTemplates中设置模板的想法,但我认为我已经过度研究(如果可能的话),这导致了我的困惑。使用多种类型的模型并创建不同的EditorForModel模板

基本上,我试图尽量减少代码复制。我为客户提供了5项服务,每项服务都有4至6种不同的解决方案。使事情变得更加复杂,在某种程度上可以在许多解决方案中共享某些类型。

为了使这个简单,采取类型:

public string FirstName { get; set; } 

我会在每个解决方案使用这个(和上升中的每一个服务的“树”)。但很明显,我有许多其他类型的解决方案,或者在几个解决方案之间共享,或者根本没有。

比方说,我有100种类型的每个服务。我可以将它们分开为不同的查看模型,但是我必须将这5个服务分解。我宁愿将它们全部保存在一个View Model,每个服务中。

我尝试创建模板时遇到了麻烦。我想使用模板,因为我使用的是向导,我不想在特定的解决方案中为向导的每个部分重新创建视图,特别是如果它是相同的“数据”(并且再次考虑因素我拥有的解决方案数量)。

因此,我创建了一个BasicDetails.cshtml视图(带有名字,姓氏和电子邮件等类型),它可以在所有解决方案中实际使用。一个编辑器模板在这里看起来很理想,但是我的困惑产生了,因为如果我使用ServiceViewModelOne.cs并执行@ Html.EditorForModel(),我要么吐出所有100种类型,要么使用模板只吐出我想要的内容BasicDetails.cshtml,在\ Views \ Shared \ EditorTemplates \ ServiceViewModelOne.cshtml中创建一个模板。

现在,我将能够,例如,请执行下列操作:

@Html.EditorForModel("BasicDetails") 
@Html.EditorForModel("WizardStep2") 
@Html.EditorForModel("WizardStep3") 

因为我想让(和但更多的我想作)每个自定义模板,使用相同的ServiceViewModelOne的.cs?如果我是正确的,我会再有以下文件夹结构:

  • \查看\共享\ EditorTemplates \ BasicDetails.cshtml
  • \查看\共享\ EditorTemplates \ WizardStep2.cshtml
  • \查看\共享\ EditorTemplates \ WizardStep3.cshtml
  • ...

显然,每个模板中我会有相应的

<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或automapping意味着我将不得不创建3个不同的东西来解决上述问题,以及如果我需要在另一个解决方案中使用Type3和Type4会怎样。

我可能脱离基地,但它似乎限制迫使我创造多个排列,这正是我希望避免的。

我会承认没有使用过AutoMapper,并且正在研究是否有帮助。

回答

0

UPDATE(ANSWER) 我想出了如何处理这个问题,以防万一这对其他人发布答案有帮助。 出于我的目的,这有助于大幅度提高,并在坚持DRY(有点)的情况下开辟了许多可能性,因为拥有一个模板比拥有相同字段的6个文件更好。

我发布了这个问题,因为我试着在\ Views \ Shared \ EditorTemplates \ BasicDetails.cshtml中放置一个模板,并刚刚得到我返回的所有属性(如FirstName等字段),而不是我想要的(FirstName ,姓氏,电子邮件)。如果我有模型BasicDetails.cs(例如),通常将模板放在\ Shared \文件夹中是正确的。

读埋在Brad Wilson's Post的评论,我意识到,我应该改为尝试把模板

\ {意见} CurrentController \ EditorTemplates \ BasicDetails.cshtml。

工作显示视图和验证错误弹出“所需”字段和向导,单击任一“下一步”或之后完成其自身的措施“提交”

要重申,我用

@Html.EditorForModel("BasicDetails") 

其中“BasicDetails”是电流控制器里面的模板的名称。

1

由于问题的复杂性,它有点令人困惑,但我会采取一个刺。

编辑模板以两种方式处理约定 - 文件的名称需要与模型的名称匹配,并且模板的类型需要与模型的类型相匹配。

所以,如果你有多个不同名称的类,但你想使用一个模板,它不会工作。

我可以看到几个选项。

  1. 在模型上使用[UIHint]来指定模板的名称。
  2. 在您的服务和演示文稿之间创建另一个层,将模型映射到视图模型中,这样View不需要关心渲染100多个不同的类。你可以使用像AutoMapper这样的东西来轻松完成这个任务。

我强烈建议使用选项2(如果可能)。再次,不知道我是否理解你的问题。

+0

你绝对明白我的困境。我已更新我的问题,以考虑您的回应。 – REMESQ 2012-02-06 20:47:27

+1

@REMESQ - 听起来像你已经按照你的编辑外观排序了。我很高兴,因为它变得更加混乱。 :) – RPM1984 2012-02-07 02:20:36