【问题标题】:Where to put extra view data that doesnt relate to view data在哪里放置与视图数据无关的额外视图数据
【发布时间】:2016-01-22 16:13:01
【问题描述】:

那么,让我们看一个例子。我有一个看起来像这样的客户视图模型:

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 没有能力干净地拥有一个静态类,该类可以通过扩展方法分成小的有组织的单元。所以任何全局助手都可能变得又大又丑。

【问题讨论】:

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


    【解决方案1】:

    您应该在模型中包含List&lt;CustomerType&gt;,但不要在模型中实现函数。而是从控制器设置数据。

    类似这样的:

    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();
    

    【讨论】:

    • 这似乎会变得更加讨厌。在有多个查找下拉列表的更现实的场景中,这将导致巨大的操作方法和控制器。在实践中是这样吗?还是我只是过于偏执?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      我不清楚该视图在您的应用程序中的作用,但它看起来像是某种客户创建表单。仅仅称它为CustomerModel 并不能很好地解释课程的意图。您可能希望调用您的模型CreateModel,用于从CustomerController 中的Create() 方法返回的Create.cshtml。那么在这个模型中添加CustomerTypes 是有意义的:如果你想创建一个客户,你需要有CustomerTypes。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-12
        • 2016-07-21
        • 2011-07-01
        • 2011-11-11
        • 1970-01-01
        相关资源
        最近更新 更多