如何在控制器/视图mvc中使用多个模型

本文关键字:模型 mvc 控制器 视图 | 更新日期: 2023-09-27 18:28:18

我有两个模型;一个保存页面上显示的字段的值,另一个根据用户变量保存该页面所需的字段。(把它想象成一个组合框,在每个变量上,为页面呈现不同的字段)。我的问题是,在一个视图/控制器中使用这两个模型的最有效和最易于管理的方式是什么?我试图将它们元组化,但我发现我需要创建一个无参数的构造函数错误。非常感谢。

如何在控制器/视图mvc中使用多个模型

正如tarzanbappa所说,最好的方法之一是在每个ViewModel中添加额外的字段。

为了不进入每个ViewModel并添加所需的所有属性,可以添加其他ViewModel的变量实例。

例如:(您的ViewModels)

public class MyViewModel()
{
    public T PropertyOne { get; set; }
    public T PropertyTwo { get; set; }
    public MyOtherViewModel PropertyThree { get; set; }
}

public class MyOtherViewModel()
{
    public T PropertyOneCheck { get; set; }
    public T PropertyTwoCheck { get; set; }
}

然后在您的DataModel调用中,设置您的变量。例如:(LINQ)

...
PropertyThree = (from r in context.Table
                where conditionIsMet
                select new MyOtherViewModel
                {
                    PropertyOneCheck = r.PropertyOneCheck,
                    PropertyTwoCheck = r.PropertyTwoCheck
                }).FirstOrDefault();
... 

在您的视图中,您可以按如下方式切换字段的可见性:

@if(Model.PropertyThree.PropertyOneCheck)
{
    //Show Field
}else
{
    //Hide Field
}

最好的方法是有一个专门为UI设计的视图模型,听起来,它将是您当前两个模型的混合。

您可以使用DataAnnotations向每个属性添加元数据,然后验证您的模型,例如

public class ViewModel
{
    [Required]
    public string PropertyOne { get; set; }
    [Required]
    public string PropertyTwo { get; set; }
}
...
var model = new ViewModel();
var results = new List<ValidationResult>();
if (!Validator.TryValidateObject(model, new ValidationContext(model), results)) {
    Console.WriteLine("Model is not valid:");
    foreach (var r in results) {
        Console.WriteLine(r.ErrorMessage);
    }
} else {
    Console.WriteLine("Model is valid");
}

实例