2011-10-19 11 views
5

Ho utilizzato il modello di repository descritto nel blog di Bob Cravens per creare la mia applicazione, ma sono un po 'nuovo e continuo a trovarlo. Voglio iniettare il mio oggetto DataService nel costruttore del mio ViewModel in modo da poter creare un oggetto SelectList e creare una casella a cascata nella mia vista. Tuttavia non riesco a far funzionare le associazioni, ogni volta che creo il ViewModel cerca/esegue il costruttore senza parametri! Ho provato vari modi usando le risposte qui su SO ma senza successo. L'aiuto sarebbe molto apprezzato.Come posso passare un oggetto nel costruttore del mio VIewModel? ASP.NET MVC 3, Ninject

ViewModel:

public class ServerCreateViewModel 
{ 
    public SelectList Companies { get; private set; } 

    public ServerCreateViewModel() 
    { 

    } 

    public ServerCreateViewModel(DataService _dataService) 
    { 

     Companies = new SelectList(_dataService.Companies.All(), "Id", "CompanyName"); 

    } 

Ninject modulo:

 Bind<DataService>().ToSelf() 
      .InRequestScope(); 

     var _dataService = Kernel.Get<DataService>(); 

     Bind<ServerCreateViewModel>() 
      .ToSelf() 
      .WithConstructorArgument("_dataService", _dataService); 

     //Bind<ServerCreateViewModel>() 
     // .ToSelf() 
     // .WithConstructorArgument("_dataService", ctx => ctx.Kernel.Get<DataService>()); 

Controller:

public ActionResult Create(ServerCreateViewModel viewModel) 
    { 

     return View(viewModel); 
    } 

risposta

12

Non dovrebbe fare questo!

Visualizza Modelli (tutti i modelli, infatti) dovrebbero essere solo benne con alcuni dati. Non devono dipendere da alcuna logica aziendale, servizi, ecc.

È responsabilità del controllore compilare i modelli e passarli alle visualizzazioni.

public class ServerCreateViewModel 
{ 
    public SelectList Companies { get; private set; } 
} 

public ActionResult Create() 
{ 
    var viewModel = new ServerCreateViewModel 
    { 
     Companies = new SelectList(_dataService.Companies.All(), "Id", "CompanyName") 
    }; 

    return View(viewModel); 
} 

DataService deve essere iniettato nel controller, non visualizzare il modello.

+0

Grazie, ecco come l'avevo inizialmente ma non ero sicuro se fosse il modo corretto di farlo! Apprezzo essere messo bene su quello. – Kiada

+0

Potrebbe spiegare l'elettore, per favore? –

Problemi correlati