开发者

ASP.NET quadratic calculation returning NaN erroneously

My ASP.NET MVC web application is supposed to calculate the roots of a second-degree polynomial (quadratic) but I'm erroneously getting Nan responses. I believe this is due to my improper setup, so let me post some of my code here:

View:

<%@ 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("quadAValue", Model.quadraticAValue) %>
        <br />
        b: <%= Html.TextBox("quadBValue", Model.quadraticBValue) %>
        <br />
        c: <%= Html.TextBox("quadCValue", Model.quadraticCValue) %>
        <br />
        <input type="submit" id="quadraticSubmitButton" value="Calculate!" />
        <br />
        <br />
        <strong>Root 1:</strong>
        <p><%= Model.x1 %></p>
        <br />
        <strong>Root 2:</strong>
        <p><%= Model.x2 %></p>
    </div>
    <% } %>
</asp:Content>

Controller (handles all controlling of requests for calculations like the quadratic):

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

        [HttpGet]
        public ViewResult Quadratic()
        {
            return View(new QuadCalc());
        }

        [HttpPost]
        public ViewResult Quadratic(QuadCalc newQuadCalc)
        {
            newQuadCalc.QuadCalculate();
            return View(newQuadCalc);
        }

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

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

Model (performing calculation):

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()
        {
            //Quadratic Formula: x = (-b +- sqrt(b^2 - 4ac)) / 2a

            //Calculate discriminant
            double insideSquareRoot = (quadraticBValue * quadraticBValue) - 4 * quadraticAValue * quadraticCValu开发者_运维技巧e;

            if (insideSquareRoot < 0)
            {
                //No real solution
                x1 = double.NaN;
                x2 = double.NaN;
            }
            else if (insideSquareRoot == 0)
            {
                //One Solution
                double sqrtOneSolution = Math.Sqrt(insideSquareRoot);
                x1 = (-quadraticBValue + sqrtOneSolution) / (2 * quadraticAValue);
                x2 = double.NaN;
            }
            else if (insideSquareRoot > 0)
            {
                //Two Solutions
                double sqrtTwoSolutions = Math.Sqrt(insideSquareRoot);
                x1 = (-quadraticBValue + sqrtTwoSolutions) / (2 * quadraticAValue);
                x2 = (-quadraticBValue - sqrtTwoSolutions) / (2 * quadraticAValue);
            }
        }
    }
}

So, let's say in the View, the end-user enters a=1, b=0 and c=0, my application will output Nan for both Root1 and Root2. I think this may be due to the fact that I have not properly connected my end-user input into the instance variables of my newQuadCalc object...


Your code is failing because the values that get entered on the website are not propagated to your calculation logic. This is happening because model binding is failing due to a mismatch between the textbox names and the names of your model's properties. Your view should instead be something like this:

<% using (Html.BeginForm("Quadratic", "Calculate")) %>
<% { %>
<div>
    a: <%= Html.TextBoxFor(m=> m.quadraticAValue) %>
    <br />
    b: <%= Html.TextBoxFor(m => m.quadraticBValue) %>
    <br />
    c: <%= Html.TextBoxFor(m => m.quadraticCValue)%>
    <br />
    <input type="submit" id="quadraticSubmitButton" value="Calculate!" />
    <br />
    <strong>Root 1:</strong>
    <p><%= Html.DisplayFor(m => m.x1) %></p>
    <br />
    <strong>Root 2:</strong>
    <p><%= Html.DisplayFor(m => m.x2)%></p>
</div>
<% } %>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜