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

时间:2014-10-29 09:20:49

标签: c# model-view-controller model tuples multiple-models

我有两个型号;一个保存页面上显示的字段的值,另一个保存该页面所需的字段,具体取决于用户变量。(将其视为一个组合框,对于每个变量,为页面呈现不同的字段)。我的问题是在单个视图/控制器中使用这两个模型的最有效和可管理的方法是什么?我试图将它们编组,但我得到了我需要创建一个无参数的构造函数错误。谢谢。

2 个答案:

答案 0 :(得分:0)

最好的方法是拥有专为UI设计的 view 模型,通过声音,它将是您当前两个模型的混合体。

您可以使用DataAnnotations向每个媒体添加元数据,然后Validate您的模型。

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");
}

Live Example

答案 1 :(得分:0)

正如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
}