2017-10-05 98 views
0

我有一个从模型脚手架的视图。我需要从“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(); 
    } 
}   

我如何走出 “editfor” 框中的值,对其进行计算,然后将这些计算结果(多个结果,而不仅仅是一个)传递回视图中的某些标签?

在winforms中这是一件很简单的事情,这正是我通常使用的,但我正在努力寻找答案。看起来我从搜索中得到的其他9,000个结果总是关于将数据(作为整体模型)写入数据库。这将没有数据库。这只是一个采用数值的形式,计算和吐出结果。如何将这些值拉入控制器,将球体添加到圆柱体,然后将圆柱体添加到轴并将两个结果分别传回到标签(或以其他方式查看它们)??????????????????????????

感谢, [R

+0

请注意,在JavaScript中进行数学计算是完全可行的,因此您不一定必须将值发送回服务器以对其运行计算。除非你有某些特定的原因(比如隐藏你的计算结果)将它们放在服务器上。 – NightOwl888

+0

我想过这样做,但是会有很多计算,我需要很好的调试和编写测试用例的能力。 – rmnrdi

+0

如果您确实需要在服务器上执行此操作,那么您应该考虑使用ajax发布值并使用返回的值更新DOM以提高性能 –

回答

0

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

然后你可以在方法内部进行,像这样计算:

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属性,但这会变得有点麻烦。

+0

神奇的解释!这就是我需要知道的。最后一件事。我有很多计算要执行。控制器是最好的地方吗? ViewModel会是一个更好的地方吗?还是应该将模型传递给执行所有计算的单独类,然后返回模型? – rmnrdi

+1

严格意义上的问题。我的工作是保持控制器亮,所以我创建了静态工厂方法来执行计算和数据库调用等操作。 – akerra

+1

mvc中没有'ViewState'这样的东西。你指的是'ModelState' –

1

你需要做的第一件事是添加接受OpticalcTestViewModel类型的参数,并标注了[HttpPost]属性到控制器的动作:

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

你可能注意到了在进行了计算之后,您需要修改model变量以添加新计算,然后您只需将其发回到视图(return View(model))。

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

在这两种情况下,我会高度建议采取一些关于ASP.NET MVC的教程。微软有几个体面的教程,但也有很多免费的在线资源。

+0

谢谢maccettura。过去我一直试图通过教程,但它似乎总是以相同的方式结束。我很无聊,代码被破坏,然后回答更多的问题。我一直在做他们,但我没有发现很多我从中获得很多。不幸的是,通过教程学习是非常不理想的,因为它不允许提出问题。虽然我们正在讨论教程的主题。有什么建议么?任何真正给你带来“啊哈”时刻的教程? – rmnrdi

相关问题