2010-09-07 2 views
1

Предположим, у меня есть два объекта: A и B, как с моделью, так и с контроллером. Пользователь находится в представлении для A, затем нажимает кнопку или что-то, что вызывает действие в контроллере A. Для этого действия требуется некоторое использование модели B. Из действия в контроллере A, я должен позвонить непосредственно на модель B, или мне нужно пройти через контроллер B, чтобы взаимодействовать с моделью B? Спасибо за прочтение.Простой вопрос о MVC

ответ

0

Я думаю, вы должны пройти через контроллер B, поскольку контроллер B имеет доступ к модели B.

+1

Что значит «имеет только доступ»? Нет причин, чтобы это было так. –

+3

Вы "догадываетесь"? Это то, как вы кодируете, гадая? – RPM1984

+0

упс! удалено слово «только». – happyhardik

0

Если объекты имеют отношение между ними (например, многие-ко-многим между вопросом и ответом), вы можете дать ваш объект A Model A список моделей объекта B (и наоборот)

В вашей модели класса для объекта а, это будет выглядеть так:

[Key] 
[Display(Name = "Primary Key")] 
public int QuestionId{ get; set; } 
public virtual IList<Answer> Answers{ get; set; } 

и аналогично для объекта B (Answers, который имеет IList вопросов)

Это позволяет вам называть объект B (ответ) в вашем контроллере как object.answers или же вы его структурировали.

Вы, вероятно, придется добавить многие-ко-многим OnModelBuild() как:

protected override void OnModelCreating(DbModelBuilder modelBuilder){ 
       modelBuilder.Entity<Question>().HasMany(a => a.Answers).WithMany(b => b.Questions); } 
0

Вы никогда не должны вызывать контроллер B от A, или наоборот, потому что в этом случае вы делаете приложение, будет слишком строгим! Вы всегда должны отделять свое приложение. Представьте, что вы изменили работу для метода B контроллеров, который использовался контроллером A, вы будете застревать. Лучше всего создать еще один слой, который обрабатывает все это, и контроллеры должны просто называть слои, . Например: Бизнес-уровень (BLL): Наличие UserBLL.cs -> имеет метод: Аутентификация (имя строки, строка пароль) {}

Ваш контроллер A и B могут вызвать этот слой (UserBLL.cs) и использовать его. Таким образом, приложение будет надежно и развязано. Лучше должен создать другой слой, слой репозитория (для операций Crud).

0

Вы можете либо создать ViewModel, содержащий обе модели

Model A {} Model B{} 
ViewModel AB{ 
    Model A; 
    Model B; 
} 
           //Custom model binder if you want to pass the ViewModel 
public ActionResult SomeAction(Model A, Model B) { 
    //Logic 
    //pass the ViewModel(A,B) to the View 
} 

Или вы можете передать управление на контроллер, который обрабатывает B логику модели. Последний сценарий, о котором я могу думать, это создание службы B, которая получает модель A и делает логику

Смежные вопросы