2013-09-04 16 views
9

Attualmente ho un controller con un'istruzione LINQ che sto passando i dati dalla mia vista. Sto cercando di trovare un metodo di codifica più efficiente e migliore per farlo. L'istruzione del mio controller domestico è la seguente.MVC 4 come passare correttamente i dati dal controller per visualizzare

Var Melt 
    Furnace1 = 
      (from item in db.tbl_dppITHr 
      where item.ProductionHour >= StartShift && item.ProductionHour <= EndDate 
      select item).Sum(x => x.Furnace1Total), 

ViewData["Furnace1Total"] = Melt.Furnace1; 

A mio avviso, quindi, faccio riferimento al ViewData per mostrare questo. Utilizzo di

@model dynamic 

Ora ho un sacco di istruzioni linq all'interno del metodo Index. E per ognuna sto facendo il ViewData[]

Spero che qualcuno possa mostrare come ho passato più di una var da un controller a una vista senza i metodi ViewData o ViewBag. E come avrei avuto accesso a questo secondo me.

+0

mettere il vostro modello in una classe come un modello di vista e poi passarlo a vedere. –

risposta

9

È necessario creare uno ViewModel con tutti i dati necessari e quindi passare tale visualizzazione alla vista.

public class ViewModel 
{ 
    public List<int> Melt1 { get; set; } 

    public void LoadMeltProperties() 
    { 

     if (Melt1 == null) 
     { 
      Melt1 = new List<int>(); 
     } 

     Melt1 = (from item in db.tbl_dppITHr 
     where item.ProductionHour >= StartShift && item.ProductionHour <= EndDate 
     select item).Sum(x => x.Furnace1Total).ToList(); 
    } 

    public ViewModel Load() 
    { 
     LoadMeltProperties(); 
     return this; 
    } 
} 

public ActionResult YourControllerAction() 
{ 
     var vm = new ViewModel().Load(); 
     return View("ViewName", vm); 
} 

Poi, nel tuo Vista è possibile utilizzare un modello di strongly typed piuttosto che dynamic

@model ViewModel 

È quindi possibile iterare su vostre proprietà ViewModel via:

foreach(var melt in Model.Melt1) { 
    // do what you require 
} 
+0

non ti sei perso il 'Modello' in' foreach (var melt in Melt1) '? – sasjaq

+0

@sasjaq - sì, grazie :) –

+0

Ho creato un modello, quindi è la migliore pratica per me fare il mio codice LINQ all'interno del modello in un nuovo metodo e chiamarlo dal controller per passare alla visualizzazione? – Inkey

1

Utilizzare i modelli invece

var Melt 
Furnace1 = 
     (from item in db.tbl_dppITHr 
     where item.ProductionHour >= StartShift && item.ProductionHour <= EndDate 
     select item).Sum(x => x.Furnace1Total), 
return View("SomeVIew",MeltFurnace1) 

In considerazione @model "TypeOfMeltFurnace1"

È possibile fare riferimento modello nella vista dalla proprietà modello

6

IMHO, è necessario creare un ViewModel un dato passa utilizzarlo.

Creare una classe

public class MyViewModel 
{ 
    public <MeltFurnace1Type> MeltFurnace1{get;set;} 
} 

In Azione Metodo

public ActionResult Action() 
{ 
     MyViewModel vm = new MyViewModel(); 
     vm.MeltFurnace1 = something; 
     return View("YourViewName", vm); 
} 

In vista

@model MyViewModel 

//You can access your property using 
Model.MeltFurnace1 
2

Se è necessario passare i dati in realtà dal controllore e dei suoi dati è dipendono interno stato o parametri del controller di input o ha altre proprietà di "dati aziendali", è necessario utilizzare la parte del modello da MVC pattern:

oggetti del modello sono le parti dell'applicazione che implementano la logica per il dominio dei dati dell'applicazione. Spesso gli oggetti del modello recuperano e memorizzano lo stato del modello in un database. Ad esempio, un oggetto prodotto potrebbe recuperare informazioni da un database, operare su di esso e quindi scrivere le informazioni aggiornate su una tabella prodotti in un database SQL Server .

È possibile visualizzare i dettagli here oppure consultare la parte Models and Validation in ASP.NET MVC del tutorial Microsoft.

  1. classe Add modello:

    public class Person 
    { 
        public int Id { get; set; } 
        public string Name { get; set; } 
        public int Age { get; set; } 
        public string City { get; set; } 
    } 
    
  2. Passo modello a oggetti per la vista:

    public ActionResult Index() 
    { 
        var model = GetModel(); 
        return View(model); 
    } 
    
  3. Aggiungi strongly typed View tramite definire tipo di modello:

    @model Person 
    
  4. Usa Model variabile nella vista:

    @Model.City 
    
Problemi correlati