每个供应商的内容不同

时间:2013-12-04 10:55:48

标签: c# asp.net-mvc-4

我正在构建一个显示不同供应商表单的网站。

每个供应商都有一些共同的属性,但有一些特定于某些供应商的属性。例如,一个供应商要求customer's Title(即MrMrs ...),而其他供应商则不会。 更有甚者,一些属性可能有不同的行为。在上面的Title示例中,一个供应商可以将其作为自由文本,而另一个供应商将其作为选项选择。

为此,我有一个基类作为模型,它拥有最常见的属性,对于每个供应商,我将创建从基础继承的类,以添加供应商特定的属性,或更改其行为(如添加数据注释) )。

所以,我想创建特定于每个供应商的表单。我所做的并且它确实有效,是在标准ViewsModelsControllers文件夹中创建通用文件夹,每个供应商都有自己的Area

这真的是正确的方法吗?我看到这些区域主要用于迷你网站或本地化。

任何意见将不胜感激。

1 个答案:

答案 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)
}