将表单内容传递给控制器​​,进行计算,然后传回多个结果

时间:2017-10-05 18:25:27

标签: c# asp.net-mvc-5

我有一个从模型搭建的视图。我需要从" editfor"中检索值。帮助器标签,做一堆计算,然后将结果(多个)传回给视图。我创建了一个小例子来澄清。

public class OpticalcTestViewModel
{
    public double OD_Sphere { get; set; }
    public double OD_Cylinder { get; set; }
    public int Axis { get; set; }
}

创建这个脚手架:

@using (Html.BeginForm()) 
{
 @Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>OpticalcTestViewModel</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.OD_Sphere, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.OD_Sphere, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.OD_Sphere, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.OD_Cylinder, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.OD_Cylinder, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.OD_Cylinder, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Axis, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Axis, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Axis, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>
   }

    <div>
     @Html.ActionLink("Back to List", "Index")
    </div>

     @section Scripts {
     @Scripts.Render("~/bundles/jqueryval")
      }

这是我的控制者:

public class OpticalcTestController : Controller
{
    // GET: OpticalcTest
    public ActionResult Index()
    {

        return View();
    }
}        

如何从&#34; editfor&#34;中获取值?框,对它们执行计算,然后将这些计算的结果(多个结果,而不仅仅是一个)传递回视图中的某些标签?

在winforms中这是一件非常简单的事情,这是我经常使用的事情,但我在我的智慧结束时试图找到答案。我从搜索中获得的其他9,000个结果似乎总是将数据(作为整个模型)写入数据库。这将没有数据库。它只是一个采用数值,计算和吐出结果的表单。

更具体地说,我如何将这些值拉入控制器,将球体添加到圆柱体,然后将圆柱体添加到轴并将两个结果分别传递回标签(或以其他方式查看它们)?

谢谢, [R

2 个答案:

答案 0 :(得分:1)

您需要做的第一件事是向您的控制器添加一个操作,该操作接受OpticalcTestViewModel类型的参数,并使用[HttpPost]属性进行标记:

[HttpPost]
public ActionResult Index(OpticalcTestViewModel model)
{
    //perform calculations
    return View(model);
}

如上所述,执行完计算后,您需要修改model变量以添加到新计算中,然后将其发送回视图(return View(model))。 / p>

默认情况下,视图中的表单正在执行POST。由于您没有能够处理POST请求的操作,因此您将永远无法为这些调用提供服务。上面的代码应该解决所有问题。

在任何一种情况下,我都高度建议在ASP.NET MVC上学习更多教程。微软有一些不错的教程,但网上也有很多免费资源。

答案 1 :(得分:0)

你需要一个HttpPost方法来接受视图中的模型,并访问绑定到EditorFor帮助元素的属性,如maccettura所写。

然后你可以在方法中执行类似的计算:

double sphereRadius = model.OD_Sphere / 2; // demo calc

计算结果是否在同一视图上?同型号? 假设是,我建议计算值的新模型属性,然后将它们绑定到您的视图。您可以使用Razor根据需要显示/隐藏输入和计算值。

假设您使用上面带有新模型属性的计算的示例:

public class OpticalcTestViewModel
{
    public double OD_Sphere { get; set; }
    public double OD_Cylinder { get; set; }
    public int Axis { get; set; }

    public double sphereRadius { get; set; } // new calculated property
}

[HttpPost]
public ActionResult Index(OpticalcTestViewModel model)
{
    double sphereRadius = model.OD_Sphere / 2; // demo calc
    model.sphereRadius = sphereRadius;
    return View(model);
}

请注意,如果您尝试编辑已绑定到视图的模型属性,它将保留其旧值。这是因为该值实际上保留在ModelState中,默认模型绑定器将首先检查它并使用值(如果存在)。要覆盖它,你必须清除ModelState属性,但这有点混乱。