2014-10-29 79 views
0

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

+1

你可以使用它由两个模型的字段的视图模型,你需要 – tarzanbappa 2014-10-29 09:25:14

+0

谢谢你为你的快速反应tarzanbappa。问题是,第二个模型(将页面标记为页面所需的字段)是系统的新要求,实现此方法需要我们重新创建所有系统的视图模型。有其他解决方法吗?谢谢。 – CodeMagician 2014-10-29 09:53:43

回答

0

正如tarzanbappa说,最好的方法之一将是为你增添每个视图模型附加字段。

为了不进入每个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 
} 
0

最好的办法是有一个专门为UI设计的模型,它听起来很像现在的两个模型的混合体。

您可以使用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

+0

你好詹姆斯,感谢你的回复。我想我或者错过了一些东西,或者我在描述这个问题时并不清楚。取决于用户的选择,需要哪些字段将被动态决定。例如,如果用户选择2轮,则属性摩托车名称将是必需的,而属性名称不会。如果用户选择4轮车名将是必需的,摩托车名不会。对不起,如果这不明确的描述... – CodeMagician 2014-10-29 10:27:29

+0

@CodeMagician听起来像你需要一个自定义属性,使该依赖关系 - 请参阅[这个答案](http://stackoverflow.com/a/15975880/82586) – James 2014-10-29 12:29:08

相关问题