2010-10-27 6 views
0

OK, j'ai un problème où mon calcul n'a jamais lieu, comme il est supposé le faire. J'essaie de faire un calcul qui résout pour les racines d'une équation quadratique en utilisant la formule quadratique, basée sur les valeurs de a, b et c entré dans une forme primitive.ASP.NET MVC Application non calculable, n00b question

Maintenant, permettez-moi de fournir le code de mon modèle, vue et contrôleur pour cette application:

Modèle:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace RootFinder.Models 
{ 
    public class QuadCalc 
    { 
     public double quadraticAValue { get; set; } 
     public double quadraticBValue { get; set; } 
     public double quadraticCValue { get; set; } 
     public double x1 { get; set; } 
     public double x2 { get; set; } 

     public void QuadCalculate(out double x1, out double x2) 
     { 
      //Quadratic Formula: x = (-b +- sqrt(b^2 - 4ac))/2a 

      //Calculate the inside of the square root 
      double insideSquareRoot = (quadraticBValue * quadraticBValue) - 4 * quadraticAValue * quadraticCValue; 

      if (insideSquareRoot < 0) 
      { 
       //There is no solution 
       x1 = double.NaN; 
       x2 = double.NaN; 
      } 
      else 
      { 
       //Compute the value of each x 
       //if there is only one solution, both x's will be the same 
       double sqrt = Math.Sqrt(insideSquareRoot); 
       x1 = (-quadraticBValue + sqrt)/(2 * quadraticAValue); 
       x2 = (-quadraticBValue - sqrt)/(2 * quadraticAValue); 
      } 
     } 
    } 
} 

Vue:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
Polynomial Root Finder - Quadratic 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2>Quadratic</h2> 

    <% using(Html.BeginForm("Quadratic", "Calculate")) %> 
    <% { %> 
    <div> 
     a: <%= Html.TextBox("quadraticAValue") %> 
     <br /> 
     b: <%= Html.TextBox("quadraticBValue") %> 
     <br /> 
     c: <%= Html.TextBox("quadraticCValue") %> 
     <br /> 
     <input type="submit" id="quadraticSubmitButton" value="Calculate!" /> 
     <br /> 
     <p><%= ViewData["Root1"] %></p> 
     <p><%= ViewData["Root2"] %></p> 
    </div> 
    <% } %> 
</asp:Content> 

Controller:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using RootFinder.Models; 

namespace RootFinder.Controllers 
{ 
    public class CalculateController : Controller 
    { 
     // 
     // GET: /Calculate/ 

     public ActionResult Index() 
     { 
      return View(); 
     } 

     [AcceptVerbs(HttpVerbs.Get)] 
     public ViewResult Quadratic() 
     { 
      ViewData["Root1"] = ""; 
      ViewData["Root2"] = ""; 
      return View(); 
     } 

     [AcceptVerbs(HttpVerbs.Post)] 
     public ViewResult Quadratic(QuadCalc newQuadCalc) 
     { 
      ViewData["Root1"] = newQuadCalc.x1; 
      ViewData["Root2"] = newQuadCalc.x2; 
      return View(); 
     } 

     public ActionResult Quartic() 
     { 
      return View(); 
     } 

     public object x1 { get; set; } 

     public object x2 { get; set; } 
    } 
} 

Maintenant, j'essaye de toujours travailler ceci, mais je crois que le problème peut résider dans l'assignation des valeurs entrées du formulaire, dans un nouvel objet pour le calcul. Cela pourrait aussi être un problème étant donné que MVC prendra probablement la forme entrée une chaîne stype, au lieu d'un double, où dans mon modèle, j'effectue des calculs basés sur l'entrée étant un type double.

Je ne sais pas où faire la chaîne à double conversion si cela est même nécessaire.

Est-ce que quelqu'un voit pourquoi il y a un problème?

La page produit les éléments suivants:

x1 = 0 
x2 = 0 

Répondre

4

Vous n'appelez jamais la méthode QuadCalculate. À côté de cela, je suggère de déplacer le QuadCalculate à partir du modèle de vue. Ce dernier conseil n'affecte en rien la réponse réelle. C'est juste une façon respectueuse d'implémenter le pattern MVC.

Par exemple:

Votre classe modèle

public class QuadCalc { 
    public double quadraticAValue { get; set; } 
    public double quadraticBValue { get; set; } 
    public double quadraticCValue { get; set; } 
    public double x1 { get; set; } 
    public double x2 { get; set; } 
} 

et vos méthodes de régulation

[AcceptVerbs(HttpVerbs.Post)] 
public ViewResult Quadratic(QuadCalc newQuadCalc) { 
    // move your calculation method here or, better, 
    // to a class that implements the repository pattern 
    // do the calculation and then set the x1 and x2 members of 
    // your model class 
    // You dont even need to use ViewData for this, just return 
    // back your model class to your view 
    return View(newQuadCalc); 
} 

Vous pouvez transformer votre point de vue en une vue fortement typé et utilisez votre classe de modèle à l'intérieur

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<RootFinder.Models.QuadCalc>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
Polynomial Root Finder - Quadratic 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2>Quadratic</h2> 

    <% using(Html.BeginForm("Quadratic", "Calculate")) %> 
    <% { %> 
    <div> 
     a: <%= Html.TextBox(Model.quadraticAValue) %> 
     <br /> 
     b: <%= Html.TextBox(Model.quadraticBValue) %> 
     <br /> 
     c: <%= Html.TextBox(Model.quadraticCValue) %> 
     <br /> 
     <input type="submit" id="quadraticSubmitButton" value="Calculate!" /> 
     <br /> 
     <p><%= Model.x1 %></p> 
     <p><%= Model.x2 %></p> 
    </div> 
    <% } %> 
</asp:Content> 

Moins de chaînes magiques, si vous changez un nom de propriété, vous pouvez obtenir une erreur de compilation (si vous activez la compilation de vue), le code du nettoyeur et bien d'autres avantages vous attendent! :)

+0

photo de profil cool – CRice

+0

Merci beaucoup pour ces réponses détaillées :) J'essaie d'envelopper ma tête autour de cela, et il semble produire du code vraiment propre et séparé. – Qcom

+0

Une chose cependant, comment puis-je utiliser les variables d'instance d'une classe dans une autre classe. Comment puis-je faire référence à cette classe dans une classe différente? – Qcom

1

Quelque part dans le mix que vous avez réellement besoin d'appeler QuadCalculate. Je ne comprends pas exactement comment vous envisagez d'utiliser les trois différentes paires de x1 et x2 que vous conservez dans votre code. Peut-être que quelques explications sur la raison de l'existence de ces trois paires pourraient vous aider à rationaliser le problème. Alors ... pourquoi y en a-t-il trois?