【发布时间】:2012-02-06 19:59:02
【问题描述】:
我对如何实现 EditorForModel 有点困惑。我想到在 Views\Shared\EditorTemplates 中设置模板,但我认为我已经过度研究(如果可能的话),这导致了我的困惑。
基本上,我会尽量减少代码复制。我向客户提供 5 项服务,每项服务都有 4 到 6 种不同的解决方案。使事情变得更复杂的是,某些类型可以在许多解决方案之间不同程度地共享。
为了简单起见,请输入以下类型:
public string FirstName { get; set; }
我将在每个解决方案中使用它(并在每个服务中上升到“树”)。但显然我还有许多其他类型,它们要么在几个解决方案之间共享,要么根本不共享。
假设每个服务有 100 种类型。我可以将它们分离为不同的视图模型,但是我必须通过 5 个服务来考虑这一点。我更愿意将它们全部保存在一个视图模型中,每项服务。
我在尝试创建模板时遇到了麻烦。我想使用模板,因为我正在使用向导,并且我不想在特定解决方案中为向导的每个部分重新创建视图,特别是如果它是相同的“数据”(并且再次考虑我有多少解决方案)。
因此,我创建了一个 BasicDetails.cshtml 视图(包含 FirstName、LastName 和 Email 等类型),它实际上可以在所有解决方案中使用。编辑器模板在这里似乎很理想,但我的困惑出现了,因为如果我使用 ServiceViewModelOne.cs 并执行 @Html.EditorForModel(),我要么吐出所有 100 种类型,要么使用模板只吐出我想要的BasicDetails.cshtml 通过在 \Views\Shared\EditorTemplates\ServiceViewModelOne.cshtml 创建模板。
现在,我是否可以执行以下操作:
@Html.EditorForModel("BasicDetails")
@Html.EditorForModel("WizardStep2")
@Html.EditorForModel("WizardStep3")
对于我想要制作的每个自定义模板(以及我想要制作的更多模板),都使用相同的 ServiceViewModelOne.cs?如果我是正确的,那么我将具有以下文件夹结构:
- \View\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>
...
针对特定于向导中该步骤的所有 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,并且正在研究这是否会有所帮助。
【问题讨论】:
标签: asp.net-mvc-3