ASP.NET MVC Приложение не рассчитывается, вопрос n00b - PullRequest
0 голосов
/ 28 октября 2010

ОК, у меня проблема, когда мои вычисления никогда не происходят, как это и должно быть. я пытаюсь сделать вычисление, которое решает корни квадратного уравнения, используя квадратную формулу, основанную на значениях a, b и c, введенных в примитивной форме.

Теперь позвольте мне предоставить код для моей модели, вида и контроллера для этого приложения:

Модель:

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

Вид:

<%@ 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>

Контроллер:

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

Теперь я все еще пытаюсь решить это, но я полагаю, что проблема может заключаться в присвоении введенных значений из формы в новый объект для вычислений. Это также может быть проблемой, учитывая, что MVC, вероятно, примет в форме ввода строковый стиль вместо двойного, тогда как в моей модели я выполняю вычисления на основе ввода, являющегося двойным типом.

Я не знаю, где сделать строку для двойного преобразования, если это даже необходимо, однако.

Кто-нибудь видит причину проблемы?

На странице выводится следующее:

x1 = 0
x2 = 0

Ответы [ 2 ]

4 голосов
/ 28 октября 2010

Вы никогда не вызываете метод QuadCalculate.

Кроме того, я бы предложил исключить QuadCalculate из модели представления. Этот последний совет никак не влияет на фактический ответ. Это просто уважительный способ реализации шаблона MVC.

Например:

Ваша модель класса

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

и методы вашего контроллера

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

Затем вы можете преобразовать свое представление в строгое представление и использовать внутри него класс модели

<%@ 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>

Меньше волшебных строк, если вы измените имя свойства, вы можете получить ошибку времени компиляции (если вы включите компиляцию вида), более чистый код и многие другие преимущества просто ждут вас! :)

1 голос
/ 28 октября 2010

Где-то в миксе вам нужно вызвать QuadCalculate.Я не совсем понимаю, как вы собираетесь использовать три разные пары x1 и x2, которые вы поддерживаете в своем коде.Возможно, какое-то объяснение того, почему существуют три такие пары, может помочь вам рационализировать проблему.Итак ... почему их три?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...