放置与视图数据无关的额外视图数据的位置

时间:2016-01-22 16:13:01

标签: asp.net-mvc model-view-controller viewmodel organization

所以,让我们看一个例子。我有一个Customer视图模型,如下所示:

public class CustomerViewModel {
    public string Name {get; set;}
    public int CustomerTypeId {get; set;}
}

在UI上需要下载客户类型。为了填充这一点,需要将某些内容转到业务层或数据层,并获取此客户类型列表。

在我看来,这个逻辑并不真正属于CustomerViewModel,因为它不是真正的客户数据;只有CustomerTypeId是。所以我的问题是,在一般情况下(不一定是.net MVC,而是MVC视图模型概念的一般实践),人们会将这些数据访问吗?

在视图模型中有一个名为GetCustomerTypes()的函数是否可以接受?

public class CustomerViewModel {
    public string Name {get; set;}
    public int CustomerTypeId {get; set;}

    public List<CustomerType> GetCustomerTypes() { ... }
}

我应该在业务层或帮助程序中创建一个类/方法,并在视图中手动导入代码以访问此函数吗?在我看来,这样的代码会使视图混乱并且不属于那里。

@{
    using My.App.CustomerTypeHelper;
    var helper = new CustomerTypeHelper();
    var customerTypes = helper.GetCustomerTypes();
}

...

@Html.DropDownFor(x => x.CustomerTypeId, customerTypes)

全局Html帮助程序在.Net中稍微缓解了这个问题,但我正在寻找一个更全面的解决方案,我也可以应用于PHP代码等。 PHP没有能力干净地拥有一个静态类,可以使用扩展方法将其分成小型有组织的单元。因此,任何全球助手都可能变得庞大而丑陋。

3 个答案:

答案 0 :(得分:2)

您应该在模型中包含List<CustomerType>,但不要在模型中实现函数。改为从控制器设置数据。

这样的事情:

public class CustomerViewModel {
    public string Name {get; set;}
    public int CustomerTypeId {get; set;}

    public List<CustomerType> CustomerTypes { get; set; }
}

从Controller为ViewModel分配数据:

var model = new CustomerViewModel();
model.CustomerTypes = Customer.GetCustomerTypes();

答案 1 :(得分:1)

您可以拥有一个在具有此类数据的所有定义的模型之间“共享”的类。我会选择以下内容:

public static partial class StaticData
{
    public static List<CustomerType> CustomerTypes = new Lisr<CustomerType>
    {
        new CustomerType { Name = "Whatever", Discount = 10, ....... },
        new CustomerType { Name = "Another", Discount = 0, ........}
        // etc
    }
}

请注意,这是一个部分类,因此您可以在项目中的文件/文件夹中进行拆分,并具有:

CustomerTypes.cs
SupplierTypes.cs
ProductTypes.cs

其他任何东西都作为单独的文件构建到共享的StaticData类中,最终包含所有下拉列表和任何其他非数据库信息的定义。

那么,在您的视图中,您可以使用StaticData.CustomerTypes填充选择选项。

答案 2 :(得分:1)

CustomerModel(不是 ViewModel ,因为MVC中没有 ViewModel )不是Customer的模型。它是视图Customer中使用的模型。如果该视图需要此信息,则应该在该模型中。

我不清楚该视图在您的应用程序中的作用,但它看起来像是一些客户创建表单。只是称它为CustomerModel并不能很好地解释课程的意图。您可能需要调用CreateModel中使用的Create.cshtml模型,该模型是Create()CustomerController方法返回的。然后将CustomerType添加到此模型中是有意义的:如果要创建客户,则需要CustomerType