2014-10-29 4 views
0

У меня две модели; один из которых содержит значения полей, отображаемых на странице, а другой - обязательные поля для этой страницы в зависимости от пользовательской переменной. (подумайте об этом как поле со списком, которое для каждой переменной отображает разные поля для страницы). Мой вопрос - это самый эффективный и управляемый способ использования этих двух моделей в одном представлении/контроллере? Я попытался их скопировать, но я понял, что мне нужно создать конструкторскую ошибку конструктора. Спасибо.Как использовать несколько моделей в контроллере/view mvc?

+1

вы можете использовать ViewModel, который состоит из полей обеих моделей вы должны – tarzanbappa

+0

благодарственное вы tarzanbappa для быстрого ответа. Дело в том, что вторая модель (та, которая маркирует поля, как требуется для страницы или нет) является новым требованием системы, и реализация этого метода потребует от нас воссоздать все модели представлений нашей системы. Есть ли другой способ? Спасибо. – CodeMagician

ответ

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 
} 
0

Лучшим подходом было бы создание модели , разработанной специально для пользовательского интерфейса, которая, по звукам вещей, была бы гибридом двух ваших нынешних моделей.

Вы можете использовать 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-колесный атрибут, имя мотоцикла будет требоваться, пока атрибут car-name не будет. Если пользователь выберет 4-колесное автомобильное имя, потребуется и имя мотоцикла не будет. Извините, если это было непонятно при описании ... – CodeMagician

+0

@CodeMagician звучит так, как будто вам нужен пользовательский атрибут, чтобы сделать эту зависимость - см. [Этот ответ] (http://stackoverflow.com/a/15975880/82586) – James