我正在构建一个显示不同供应商表单的网站。
每个供应商都有一些共同的属性,但有一些特定于某些供应商的属性。例如,一个供应商要求customer's Title
(即Mr
,Mrs
...),而其他供应商则不会。
更有甚者,一些属性可能有不同的行为。在上面的Title
示例中,一个供应商可以将其作为自由文本,而另一个供应商将其作为选项选择。
为此,我有一个基类作为模型,它拥有最常见的属性,对于每个供应商,我将创建从基础继承的类,以添加供应商特定的属性,或更改其行为(如添加数据注释) )。
所以,我想创建特定于每个供应商的表单。我所做的并且它确实有效,是在标准Views
,Models
,Controllers
文件夹中创建通用文件夹,每个供应商都有自己的Area
。
这真的是正确的方法吗?我看到这些区域主要用于迷你网站或本地化。
任何意见将不胜感激。
答案 0 :(得分:2)
我会说你在这里使用错误的工具(即区域),但是,你离这里不远。
而不是使用单独的区域,您需要在此处执行的每个“供应商”类型都引入了单独的视图。您可以创建基本视图并使每个特定视图继承该视图。事实上,你可能只能使用一个视图,例如
public class VendorViewModel
{
...
public CustomerViewModel Customer { get; set; }
}
public class CustomerViewModel
{
public string Title { get; set; }
public IEnumerable<string> TitleOptions { get; set; }
...
}
鉴于上述模型,您的视图可能看起来像
@model VendorViewModel
...
@if (Model.Customer != null)
{
// make title selection configurable
@if (Model.Customer.TitleOptions != null)
{
@Html.DropDownListFor(m => m.Customer.Title, new SelectList(m.Customer.TitleOptions, "[Select title]"))
}
else
{
@Html.EditorFor(m => m.Customer.Title)
}
...
}
这可以根据特定的供应商要求有效地构建您的视图,例如
Customer
属性null
TitleOptions
属性null
这只是一个简单的示例,说明如何在单个视图中动态构建视图。您可以通过将客户视图内容移动到它自己的局部视图中来整理它,并且只在需要时才进行渲染。
@if (Model.Customer != null)
{
@Html.RenderPartial("CustomerView", Model.Customer)
}