У меня две модели; один из которых содержит значения полей, отображаемых на странице, а другой - обязательные поля для этой страницы в зависимости от пользовательской переменной. (подумайте об этом как поле со списком, которое для каждой переменной отображает разные поля для страницы). Мой вопрос - это самый эффективный и управляемый способ использования этих двух моделей в одном представлении/контроллере? Я попытался их скопировать, но я понял, что мне нужно создать конструкторскую ошибку конструктора. Спасибо.Как использовать несколько моделей в контроллере/view 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
}
Лучшим подходом было бы создание модели , разработанной специально для пользовательского интерфейса, которая, по звукам вещей, была бы гибридом двух ваших нынешних моделей.
Вы можете использовать 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");
}
Привет, Джеймс, и спасибо за ваш ответ. Я думаю, что я либо что-то упускаю, либо я не был ясен в своем описании проблемы. Какие поля необходимы, будет динамически решено в зависимости от выбора пользователя. Например, если пользователь выбирает 2-колесный атрибут, имя мотоцикла будет требоваться, пока атрибут car-name не будет. Если пользователь выберет 4-колесное автомобильное имя, потребуется и имя мотоцикла не будет. Извините, если это было непонятно при описании ... – CodeMagician
@CodeMagician звучит так, как будто вам нужен пользовательский атрибут, чтобы сделать эту зависимость - см. [Этот ответ] (http://stackoverflow.com/a/15975880/82586) – James
вы можете использовать ViewModel, который состоит из полей обеих моделей вы должны – tarzanbappa
благодарственное вы tarzanbappa для быстрого ответа. Дело в том, что вторая модель (та, которая маркирует поля, как требуется для страницы или нет) является новым требованием системы, и реализация этого метода потребует от нас воссоздать все модели представлений нашей системы. Есть ли другой способ? Спасибо. – CodeMagician