2012-01-19 7 views
5

Sono nuovo alla programmazione e ASP.net MVC 3 quindi non essere sorpreso dalla mia mancanza di conoscenza su questo .. Va bene, voglio moltiplicare due decimali, un decimale viene dalla forma che un utente riempie e l'altro decimale viene dalla classe Model (lo ottiene dal database).Come eseguire semplici calcoli utilizzando gli elementi del modello e un input da un modulo in ASP.net MVC 3?

Ho due classi di modello denominate RATE & PROJECTMATERIAL. La classe RATE ha un articolo chiamato importo che indica l'importo di una tariffa e la classe PROJECTMATERIAL ha una voce quantità. Le classi sono correlate e voglio essere in grado di dire variabile1 = quantità * Rates.amount e restituire variabile1 alle mie viste Indice, Elimina, Dettagli. Non voglio memorizzare variabile1 nel mio database ma voglio solo visualizzare nelle mie visualizzazioni ..... ma non so come e dove farlo

Codice dalla classe del materiale del progetto ..

public class ProjectMaterial 
{ 
    public int ProjectMaterialID { get; set; } 

    [Required] 
    [Display(Name = "Scope Name")] 
    public int? ScopeID { get; set; } 

    [Required] 
    [Display(Name = "Rate Code")] 
    public int? RateID { get; set; } 

    [Required] 
    [Display(Name = "Quantity")] 
    public decimal Quantity { get; set; } 


    public virtual Scope Scopes { get; set; } 
    public virtual Rate Rates { get; set; } 

} 

codice dalla classe portata ..

public class Rate 
{ 
    public int RateID { get; set; } 


    [Required] 
    [Display(Name = "Rate Code")] 
    public int RateCode { get; set; } 

    [Required] 
    [Display(Name = "Unit")] 
    public string Unit { get; set; } 

    [Required] 
    [Display(Name = "Description")] 
    public string Description { get; set; } 

    [Required] 
    [Display(Name = "Amount")] 
    public decimal Amount { get; set; } 

    public virtual ICollection<ProjectMaterial> ProjectMaterials { get; set; } 
} 

Codice da classe controller progetto ...

public class ProjectMaterialController : Controller 
{ 
    private ContructorContext db = new ContructorContext(); 

    // 
    // GET: /ProjectMaterial/ 

    public ViewResult Index() 
    { 
     var projectmaterials = db.ProjectMaterials.Include(p => p.Scopes).Include(p => p.Rates); 

     return View(projectmaterials.ToList()); 
    } 



    // 
    // GET: /ProjectMaterial/Details/5 

    public ViewResult Details(int id) 
    { 
     ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id); 
     return View(projectmaterial); 
    } 

    // 
    // GET: /ProjectMaterial/Create 

    public ActionResult Create() 
    { 
     ViewBag.ScopeID = new SelectList(db.Scopes, "ScopeID", "ScopeName"); 
     ViewBag.RateID = new SelectList(db.Rates, "RateID", "Unit"); 
     return View(); 
    } 

    // 
    // POST: /ProjectMaterial/Create 

    [HttpPost] 
    public ActionResult Create(ProjectMaterial projectmaterial) 
    { 
     if (ModelState.IsValid) 
     { 
      db.ProjectMaterials.Add(projectmaterial); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.ScopeID = new SelectList(db.Scopes, "ScopeID", "ScopeName", projectmaterial.ScopeID); 
     ViewBag.RateID = new SelectList(db.Rates, "RateID", "Unit", projectmaterial.RateID); 
     return View(projectmaterial); 
    } 

    // 
    // GET: /ProjectMaterial/Edit/5 

    public ActionResult Edit(int id) 
    { 
     ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id); 
     ViewBag.ScopeID = new SelectList(db.Scopes, "ScopeID", "ScopeName", projectmaterial.ScopeID); 
     ViewBag.RateID = new SelectList(db.Rates, "RateID", "Unit", projectmaterial.RateID); 
     return View(projectmaterial); 
    } 

    // 
    // POST: /ProjectMaterial/Edit/5 

    [HttpPost] 
    public ActionResult Edit(ProjectMaterial projectmaterial) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(projectmaterial).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     ViewBag.ScopeID = new SelectList(db.Scopes, "ScopeID", "ScopeName", projectmaterial.ScopeID); 
     ViewBag.RateID = new SelectList(db.Rates, "RateID", "Unit", projectmaterial.RateID); 
     return View(projectmaterial); 
    } 

    // 
    // GET: /ProjectMaterial/Delete/5 

    public ActionResult Delete(int id) 
    { 
     ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id); 
     return View(projectmaterial); 
    } 

    // 
    // POST: /ProjectMaterial/Delete/5 

    [HttpPost, ActionName("Delete")] 
    public ActionResult DeleteConfirmed(int id) 
    {    
     ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id); 
     db.ProjectMaterials.Remove(projectmaterial); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

Grazie in ADVA ragazzi! ho davvero bisogno del tuo aiuto.

+1

Non è chiaro cosa si sta tentando di fare. Stai cercando di calcolare i totali nel controller e di ridistribuirli a una vista O stai cercando di calcolare un totale in un controller e di averlo a disposizione per TUTTE le altre visualizzazioni? – Sean

+0

Grazie, voglio calcolare e passare il risultato a tutte le altre viste (Indice, dettagli e Elimina) eccetto la vista di modifica perché il totale sarà un valore calcolato .. –

risposta

6

Visto che dite che siete nuovi a MVC, ti ho dato un paio di opzioni e ha spiegato che è meglio e perché, perché è meglio per capire la società in modo che non si ottiene per le cattive abitudini , soprattutto se inizi a costruire progetti più grandi.

Non è necessario creare una variabile, poiché è possibile eseguire tale calcolo nella vista. Perché si passa il modello di dominio direttamente alla vista si può fare (in rasoio):

@(Model.Quantity * Model.Rates.Amount) 

Anche se questa è l'opzione più semplice non lo consiglio necessariamente questo come opinioni dovrebbero essere muto - vedi ASP.NET MVC: How dumb should my view be?.

Un'altra opzione è quella di fare il calcolo nel controller e passare il valore nel ViewBag, ad esempio:

public ViewResult Details(int id) 
{ 
    ProjectMaterial projectmaterial = db.ProjectMaterials.Find(id); 
    ViewBag.Price = projectmaterial.Quantity * projectmaterial.Rates.Amountl 
    return View(projectmaterial); 
} 

allora si potrebbe utilizzare nella vostra vista come:

@ViewBag.Price 

Anche in questo caso, questo è facile ma non lo consiglierei, poiché ViewBag non è fortemente digitato - vedi Is using ViewBag in MVC bad?.

È possibile inserire una proprietà nella classe ProjectMaterial come, che è una soluzione accurata.

public decimal Price 
{ 
    get 
    { 
     return Quantity * Rates.Amount; 
    } 
} 

Tuttavia, se Price è una proprietà che è sempre e solo utilizzato entro le vostre opinioni (cioè appena visualizzarla) allora probabilmente non dovrebbe essere nel vostro modello di dominio, come il modello di dominio è proprio questo - la memorizzazione e accedere ai dati grezzi.

Forse il modo migliore è quello di creare un viewmodel specifico per la tua vista (vedi http://stephenwalther.com/blog/archive/2009/04/13/asp.net-mvc-tip-50-ndash-create-view-models.aspx) con un Prezzo propert. Ciò significa che la proprietà viene utilizzata solo dove è necessaria, il modello di dominio rimane tale, la tua vista rimane stupida e il tuo modello di dominio non è esposto alla tua vista. Vedere Why Two Classes, View Model and Domain Model? anche per una buona spiegazione dei modelli di visualizzazione

+0

Grazie mille !!! Volevo il modo migliore per farlo e sto leggendo i tuoi link ora, ho provato quello in cui ho inserito una proprietà nella classe ProjectMaterial prima (ieri) e non ha funzionato bene per me, ogni volta che creo un nuovo progetto materiale otterrò un'eccezione Null-Reference, perché Rates.Amount era ** NULL ** ho capito che si trattava di un errore logico perché sapevo che non era vero perché la tabella dei tassi era popolata. Ancora grazie molto !! –

1

Si potrebbe aggiungere una proprietà al modello ProjectMaterial:

public decimal Price 
{ 
    get 
    { 
     return Quantity * Rates.Amount; 
    } 
} 
+0

Ho provato prima e sembrava che stesse per funziona perché tutte le viste Materiale del progetto sembravano andare bene ** ma ogni volta ** creo un ** nuovo ProjectMaterial ** ho ricevuto un errore di eccezione di riferimento Null. si è lamentato che Rates.Amount era nullo che non era vero perché ho popolato la tabella delle tariffe –

0

si potrebbe desiderare di avere una funzione modello con le istanze del self.rate, e gli elementi self.material trasmessi dal vostro punto di vista. In alternativa, puoi calcolare individualmente i valori della moltiplicazione in ciascuna vista.

In entrambi i casi, dovresti essere in grado di memorizzare la copia sul valore della moltiplicazione (variabile1) nel sacchetto della vista e passarla su ciascuna vista senza doverla salvare nel DB.

ViewBag.variable1 = rate*material 
return View() 
Problemi correlati