Asp.net mvc 3 使用具有多种类型的模型并创建不同的EditorForModel模板

Asp.net mvc 3 使用具有多种类型的模型并创建不同的EditorForModel模板,asp.net-mvc-3,Asp.net Mvc 3,我对如何实现EditorForModel有点困惑。我有在Views\Shared\EditorTemplates中设置模板的想法,但我认为我研究过了(如果可能的话),这导致了我的困惑 基本上,我试图最小化代码复制。我为客户提供5项服务,每项服务有4-6种不同的解决方案。让事情变得更复杂的是,许多解决方案在不同程度上可以共享某些类型的解决方案 要简化此操作,请使用以下类型: public string FirstName { get; set; } 我将在每个解决方案中使用它(并在每个服务中使用

我对如何实现EditorForModel有点困惑。我有在Views\Shared\EditorTemplates中设置模板的想法,但我认为我研究过了(如果可能的话),这导致了我的困惑

基本上,我试图最小化代码复制。我为客户提供5项服务,每项服务有4-6种不同的解决方案。让事情变得更复杂的是,许多解决方案在不同程度上可以共享某些类型的解决方案

要简化此操作,请使用以下类型:

public string FirstName { get; set; }
我将在每个解决方案中使用它(并在每个服务中使用“树”)。但很明显,我还有许多其他类型的解决方案,它们要么在几个解决方案中共享,要么根本没有

假设每种服务有100种类型。我可以将它们划分为不同的视图模型,但是我必须通过5个服务来考虑这一点。我更希望每个服务都将它们放在一个视图模型中

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

因此,我创建了一个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?如果我是正确的,那么我将具有以下文件夹结构:

  • \查看\Shared\EditorTemplates\BasicDetails.cshtml
  • \View\Shared\EditorTemplates\WizardStep2.cshtml
  • \View\Shared\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>
...
或者在类型级别

public class MyModel
    {
        [UIHint("FirstName")]
        public string FirstName { get; set; }
    }
我可以创建一个MyModel.cs,然后将其中的一些类型自动映射到MyViewModelOne.cs、MyViewModelTwo.cs等

不过,可以说,我想我会把自己打进去的

假设我有1型,2型,3型,4型。Type1可以用于每个解决方案(保持简单,假设有4个解决方案)。Type2和Type3可以在一个解决方案中使用,但不能在其他解决方案中使用。假设在另一个解决方案中,我可以使用Type2和Type4

使用UIHint或automapping意味着我必须创建3种不同的东西来解释上面的问题,如果我需要在另一个解决方案中使用Type3和Type4该怎么办

我可能会偏离基准,但这似乎迫使我创建多个排列,这正是我希望避免的


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

由于你问题的复杂性,这有点让人困惑,但我想尝试一下

编辑器模板通过两种方式消除约定-文件名需要与模型名匹配,模板类型需要与模型类型匹配

因此,如果您有多个具有不同名称的类,但您希望使用单个模板,那么它将无法立即工作

我可以看到几个选择

  • 在模型上使用
    [UIHint]
    指定模板的名称
  • 在您的服务和表示之间创建另一层,在该层中,您可以将模型映射到viewmodels,这样视图就不需要关心渲染100多个不同的类。您可以使用AutoMapper之类的工具轻松完成此操作
  • 我强烈建议选择方案2(如果可能的话)。再说一遍,我不确定我是否理解你的问题

    更新(答案) 我想出了如何处理这个问题,如果这对其他人有用,我会发布一个答案。就我的目的而言,这非常有帮助,并且在坚持DRY(某种程度上)的同时打开了许多可能性,因为拥有一个模板比拥有6个具有相同字段的文件要好

    我发布这个问题是因为我尝试在\Views\Shared\EditorTemplates\BasicDetails.cshtml中放置一个模板,并且只返回了我的所有属性(字段,例如FirstName),而不是我想要的少数属性(FirstName、LastName、EMail)。通常,如果我有一个模型BasicDetails.cs(例如),那么将模板放在\Shared\文件夹中是正确的做法

    阅读了隐藏在中的评论,我意识到我应该试着把模板放进去

    \Views{CurrentController}\EditorTemplates\BasicDetails.cshtml.

    用于在“必填”字段中弹出查看和验证错误,向导在单击“下一步”或“提交”后完成其步骤

    重申一下,我使用了

    @Html.EditorForModel("BasicDetails")
    

    其中,“BasicDetails”是当前控制器中模板的名称

    你绝对理解我的困境。我已经更新了我的问题,以考虑您的回答。@REMESQ-听起来您已经根据编辑的外观对其进行了排序。我很高兴,因为它变得更加令人困惑
    @Html.EditorForModel("BasicDetails")