0

那么,我们来看一个例子。我有一个看起来像这样的客户视图模型:在哪里放置与视图数据无关的额外视图数据

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不具备干净地拥有静态类的能力,可以使用扩展方法将其分为小型组织单元。所以任何全球帮手都可能变得庞大而丑陋。

回答

2

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

事情是这样的:从控制器

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

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

分配数据视图模型:

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

这似乎会变得更加讨厌。这会导致在更多的实际场景中有大量的操作方法和控制器,其中有多个查找下拉菜单。它是否会在实践中出现这种情况,还是我只是过分偏执? – computrius

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填充选择选项。

1

CustomerModel(不视图模型,因为没有视图模型在MVC)不是Customer的模型。它是在视图Customer中使用的模型。如果这种观点需要这种信息,那应该是在这种模式中。

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