我有一个从模型搭建的视图。我需要从" 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
答案 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属性,但这有点混乱。