2012-01-19 14 views
5

Soy nuevo en la programación y ASP.net MVC 3 así que no te sorprendas por mi falta de conocimiento sobre esto ... De acuerdo, quiero multiplicar dos decimales, Un decimal proviene de la forma que un usuario llena y el otro decimal proviene de la clase Model (lo obtiene de la base de datos).¿Cómo hacer cálculos simples usando elementos de modelo y una entrada desde un formulario en ASP.net MVC 3?

Tengo dos clases de modelo llamadas RATE & PROJECTMATERIAL. La clase RATE tiene un artículo llamado Cantidad que indica el importe de una Tarifa y la clase PROJECTMATERIAL tiene un artículo cantidad. Las clases están relacionadas y deseo poder decir variable1 = cantidad * Rates.amount y devolver la variable1 a las vistas de mi índice, eliminar, detalles. No quiero almacenar variable1 en mi base de datos pero solo quiero mostrar en mis vistas ..... pero no sé cómo y dónde hacerlo

Código de clase de material de proyecto ..

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; } 

} 

Código de la clase de alcance ..

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; } 
} 

Código de la clase controlador de proyecto ...

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"); 
    } 

Gracias de adva ¡chicos! Realmente necesito tu ayuda.

+1

No está claro lo que está tratando de hacer. ¿Está tratando de calcular los totales en el controlador y devolverlo a una vista O está tratando de calcular un total en un controlador y tenerlo disponible para TODAS las otras vistas? – Sean

+0

Gracias, quiero calcular y pasar el resultado a todas las otras vistas (Índice, detalles y Eliminar) excepto la vista de edición porque el total será un valor calculado. –

Respuesta

6

Viendo como usted dice que es nuevo en el MVC, que le he dado algunas opciones y explicó que es mejor y por qué, porque es mejor para comprender ahora lo que no se consigue en los malos hábitos , especialmente si comienzas a construir proyectos más grandes.

No necesita necesariamente crear una variable, porque puede hacer ese cálculo en su vista. Debido a que usted está pasando el modelo de dominio directamente a la vista que se puede hacer (en la maquinilla de afeitar):

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

Aunque esta es la opción más fácil que no necesariamente recomendaría como puntos de vista deben ser tonto - ver ASP.NET MVC: How dumb should my view be?.

Otra opción es hacer el cálculo en el controlador y pasar el valor en el ViewBag, por ejemplo:

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

entonces usted podría utilizarlo en su punto de vista como:

@ViewBag.Price 

Una vez más, esto es fácil, pero no lo recomendaría, ya que ViewBag no está fuertemente tipado, vea Is using ViewBag in MVC bad?.

Puede poner una propiedad en su clase ProjectMaterial como, que es una buena solución.

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

Sin embargo, si Price es una propiedad que se utiliza solamente siempre dentro de sus puntos de vista (es decir, que acaba de mostrarlo), entonces probablemente no debería estar en su modelo de dominio, como su modelo de dominio es sólo eso - almacenar y accediendo a los datos sin procesar.

Quizás la mejor manera es crear un modelo de vista específico para su vista (vea http://stephenwalther.com/blog/archive/2009/04/13/asp.net-mvc-tip-50-ndash-create-view-models.aspx) con un Precio propert. Esto significa que la propiedad solo se usa donde se necesita, el modelo de dominio sigue siendo eso, su vista permanece muda y su modelo de dominio no está expuesto a su vista. Consulte Why Two Classes, View Model and Domain Model? también para obtener una buena explicación de los modelos de vista

+0

¡Muchas gracias! quería la mejor manera de hacerlo y estoy leyendo sus enlaces ahora, probé uno donde puse una propiedad en la clase ProjectMaterial antes (ayer) y no funcionó bien para mí, cada vez que creo un nuevo proyecto material obtendré una excepción de referencia nula, porque Rates.Amount fue ** NULL ** Me di cuenta de que era un error lógico porque sabía que no era cierto porque la tabla de tarifas estaba poblada. De nuevo Gracias mucho !! –

1

Se podría añadir una propiedad a su modelo de ProjectMaterial:

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

Intenté esto antes y parecía que iba a funciona porque todas las vistas del material del proyecto parecían estar bien ** pero cada vez ** creo un ** nuevo ProjectMaterial ** recibí un error de excepción de referencia nula. se quejó de que Rates.Amount era nulo, lo cual no era cierto porque llené la tabla de tarifas –

0

Es posible que desee tener una función de modelo con las instancias de su self.rate, y artículos self.material transmitidas de sus puntos de vista. De lo contrario, puede calcular individualmente los valores de la multiplicación en cada vista.

De cualquier forma, debe poder almacenar la copia sobre el valor de la multiplicación (variable1) en la bolsa de la vista y pasarla a cada vista sin tener que guardarla en la base de datos.

ViewBag.variable1 = rate*material 
return View() 
Cuestiones relacionadas