制作ASP.NET MVC多项式根查找程序

时间:2010-10-27 12:43:04

标签: c# asp.net-mvc asp.net-mvc-2 model

所以我刚刚尝试使用ASP.NET MVC,我真的开始喜欢一切都有一个目的(就模型,视图和控制器之间的目的分离而言)但我是仍然在将我的基本知识用于某种实际目的时遇到一些麻烦。

所以,我正在考虑尝试创建我的原始JavaScript多项式根查找器的ASP.NET MVC版本。它应该相对简单。显然它并不能解决每一个学位的所有根源(至少在目前),但我至少试图得到Quadratic-Quartic。

所以,除了HomeController之外,我还有1个控制器。这称为CalculateController,它将处理与处理特定类型多项式根的计算相关的所有控制。

因此,我有3个视图,每个不同类型的多项式为1,Quadratic.aspxCubic.aspxQuartic.aspx

现在,我想在这种情况下我需要一个模型来处理我的“业务逻辑”,即根的实际计算和代数计算。

这是我需要一些反馈的地方。

我应该创建一个Calculate类吗?这就是我现在所拥有的。在类中,我声明了5个不同的实例字符串变量(我认为这是正确的术语):

public int aValue;
public int bValue;
public int cValue;
public int dValue;
public int eValue;

这些将存储每个术语的值。现在,考虑到Quadratic和Cubic不会使用所有这些实例字段,这是一个坏主意吗?如果是这样,那么我可以为每个单独的多项式类型创建单独的类。

好的,现在,我还必须从表单中接收一些输入,以便将输入的值分配给这些变量。

我对如何做到这一点感到有点难过。

我的二次视图中有一个表单:

<% using(Html.BeginForm("QuadraticForm", "Calculate")) %>
<% { %>
    a: <%= Html.TextBox("quadraticAValue") %>
    <br />
    b: <%= Html.TextBox("quadraticAValue") %>
    <br />
    c: <%= Html.TextBox("quadraticAValue") %>
    <br />
    <input type="submit" id="quadraticSubmitButton" />
<% } %>

非常简单,非常基本。

现在,如何通过Calculat方法将这些输入的整数分配到Quadratic() e类的新对象中?

更新

好的,由于一些研究,我比以前有更多的知识,所以我将完整地保留上面的原始问题,并在下面用我发现的一些信息进行更新:

对于每种不同类型的多项式,我将在Models文件夹中有一个单独的类。目前,我正在试验QuadCalc.cs文件,即二次多项式的模型。

这是我到目前为止的代码:

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 void QuadCalculate(double quadraticdAValue, double quadraticBValue, double quadraticCValue, 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 * quadraticdAValue * 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 * quadraticdAValue);
                x2 = (-quadraticBValue - sqrt) / (2 * quadraticAValue);
            }
        }
    }
}

在上面的代码中,我得到并设置了表单的值(不确定整个stringdouble的事情是如何解决的,但我们可以担心以后的xD)然后将它们用作围绕这个着名的二次“公式”构建的方法的参数。

现在,在我的Calculate控制器中,这是我的代码,适用于Quadratics:

    [AcceptVerbs(HttpVerbs.Get)]
    public ViewResult Quadratic()
    {
        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ViewResult Cubic(QuadCalc boss)
    {
        return View();
    }

现在,在上面的代码中,我应该放置boss而不是{{1}}?我不能把它省略但我相信它应该是一个对象的名称?问题是,我从未在模型中指定过对象,我应该这样做吗?

2 个答案:

答案 0 :(得分:2)

我对你的术语感到有点困惑。也许这是一个错误?您没有在模型中指定对象。 Model是一个类,View的对象实例将被使用。 MVC模型绑定将在后台工作,以将您的输入值映射到您指定的类,作为此View的相应Controller方法的参数。

我创建了一个示例ASP.NET MVC 2项目,只是为了将其中的一部分哈希并获得可构建的示例代码。我将项目命名为PolynomialRootFinder。我在Models文件夹中创建了一个QuadCalc.cs类文件,在Views文件夹中创建了一个Calculate子文件夹,里面有一个QuadCalcIndex.aspx视图页面(我知道页面命名很麻烦。你可能想要创建更多的子文件夹或使用一些其他惯例,但这只是一个快速而肮脏的。)。

快速更改QuadCalc.cs代码:我会将QuadCalculate的签名更改为:

public void QuadCalculate(out double x1, out double x2)

无需传入已经指定为类的属性的参数,因此我取出了quadraticXValue参数。实际上我会更进一步,让x1和x2成为班级的属性,但那只是我。

接下来的内容取决于你如何实现它,但我将假设一个特定的实现并从那里开始。假设QuadCalcIndex.aspx是输入形式,QuadCalcResult.aspx显示计算结果。你的CalculateController.cs代码看起来像这样:

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

    public ActionResult QuadCalcResult(QuadCalc quadCalc)
    {
        double x1;
        double x2;
        quadCalc.QuadCalculate(out x1, out x2);
        ViewData["x1"] = x1;
        ViewData["x2"] = x2;
        return View();
    }

请注意,内置模型绑定器足够智能,可以将quadraticXValue输入映射到quadCalc对象中相同名称的相应属性,这就是您不必手动将这些值分配给对象的原因。

QuadCalcResult.aspx的内容看起来像这样:

x1: <%= ViewData["x1"] %><br />
x2: <%= ViewData["x2"] %>

修改文件/ class / property / method / variable / etc.品尝名称。我通常喜欢返回一个ViewModel类,使用强类型视图显示x1和x2之类的值,但ViewData方法有效并且适用于快速示例。

答案 1 :(得分:1)

我通常会将我发布的模型称为已发布模型。