我是MVC的新手,我想创建一个简单的视图,允许用户输入一些数据=>提交表单=>在服务器上执行一些计算=>并将具有计算数据的模型发布回同一视图。我找到了一种方法来实现它,但我不确定这是否是最好的方法,让我困扰的是,提交后,浏览器地址栏中可以看到模型属性中的所有数据:http://localhost:53718/?Number=4&结果=16
这是一个非常简化的szenario的代码:
型号:
public class CalculationModel
{
public int Number { get; set; }
public int Result { get; set; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Index(CalculationModel model)
{
return View(model);
}
[HttpPost]
public ActionResult Calculate(CalculationModel model)
{
model.Result = model.Number * model.Number;
return RedirectToAction("Index", "Home", model);
}
}
视图:
@model WebApplication1.CalculationModel
@{
ViewBag.Title = "Home Page";
}
<h2>Simple Calculation</h2>
@using (Html.BeginForm("Calculate", "Home", FormMethod.Post)){
<div class="form-horizontal" data-crypto-conversion-form>
<div class="form-group">
<div class="input-group">
@Html.EditorFor(model => model.Number, new { htmlAttributes = new { @class = "form-control " } })
</div>
</div>
<div class="form-group">
<div class="input-group">
@Html.EditorFor(model => model.Result, new { htmlAttributes = new { @class = "form-control " } })
</div>
</div>
<div class="form-group">
<input type="submit" value="Convert" class="btn btn-primary btn-sm submitConversion" />
</div>
</div>
}
我不确定从HttpPost方法执行RedirectToAction是否是个好主意:return RedirectToAction("Index","Home",model);-有更好的方法吗?
是否有任何方法可以防止模型属性值显示在url/浏览器地址栏中?
非常感谢你的帮助。
RedirectToAction
方法基本上返回一个302响应,其中位置标头中包含新的url,浏览器将对此发出新的GET请求。当您传递一个简单的模型时,它将被转换为querystring值,并添加到位置标头中的新url中。
如果不想在querystring中看到值,可以从HttpPost操作方法返回到具有相同视图模型对象的Index视图。请确保清除模型状态字典,以便呈现Result
属性的新值。您可以使用ModelState.Clear()
方法来执行此操作。
[HttpPost]
public ActionResult Calculate(CalculationModel model)
{
model.Result = model.Number * model.Number;
ModelState.Clear();
return View("Index", model);
}
如果您仍然想返回RedirectResult
响应,可以这样做,但通过TempData传递模型数据。看看这个后
如何将模型包含在RedirectToAction中?
我会改变整体方法,使用相同的视图,因为看起来您可能需要反复计算。GetIndex方法仅用于显示要处理的数据和/或结果,然后使用Post方法进行实际处理。
因此,控制器:
[HttpGet]
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(CalculationModel model)
{
model.Result = model.Number * model.Number;
model.Processed = true;
return View(model);
}
型号
public class CalculationModel
{
public int Number { get; set; }
public int Result { get; set; }
public bool Processed { get; set; }
public CalculationModel()
{
Processed = false;
}
}
以及视图,该视图将仅在发布后显示结果。
@model MvcApplication2.Models.CalculationModel
@{
ViewBag.Title = "Home Page";
}
<h2>Simple Calculation</h2>
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
<div class="form-horizontal" data-crypto-conversion-form>
<div class="form-group">
<div class="input-group">
@Html.EditorFor(model => model.Number, new { htmlAttributes = new { @class = "form-control " } })
</div>
</div>
@*@(Model.Result)*@
<div class="form-group">
<div class="input-group">
@*@Html.EditorFor(model => model.Result, new { htmlAttributes = new { @class = "form-control " } })*@
@{if (Model!=null && Model.Processed)
{
<p>@(Model.Result)</p>
}
}
</div>
</div>
<div class="form-group">
<input type="submit" value="Convert" class="btn btn-primary btn-sm submitConversion" />
</div>
</div>
}