所以,让我们看一个例子。我有一个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没有能力干净地拥有一个静态类,可以使用扩展方法将其分成小型有组织的单元。因此,任何全球助手都可能变得庞大而丑陋。
答案 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
。