我是MVC的新手,我想创建一个简单的视图,允许用户输入一些数据=>提交表单=>在服务器上执行一些计算=>并将具有计算数据的模型回发到同一视图。 我发现了一种方法可以使它工作,但我不确定这是否是最好的方法,而且困扰我的是,在提交之后,模型属性中的所有数据都可以在浏览器地址栏中看到: http://localhost:53718/?Number=4&Result=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(&#34; Index&#34;,&#34; Home&#34;,model); - 有更好的方法吗?
有没有办法阻止模型属性值显示在url / browser地址栏中?
非常感谢你的帮助。
答案 0 :(得分:0)
RedirectToAction
方法基本上返回302响应,并在位置标题中使用新网址,浏览器将向其发出新的GET请求。当您传递一个简单的模型时,它将被转换为查询字符串值,并将被添加到位置标题中的新网址。
如果您不想查看querystring中的值,可以使用HttpPost操作方法返回到具有相同视图模型对象的Index视图。确保清除模型状态字典,以便呈现Result
属性的新值。您可以使用ModelState.Clear()
方法执行此操作。
[HttpPost]
public ActionResult Calculate(CalculationModel model)
{
model.Result = model.Number * model.Number;
ModelState.Clear();
return View("Index", model);
}
如果您仍想返回A RedirectResult
响应,则可以执行此操作,但可以通过TempData传递模型数据。看一下这篇文章
答案 1 :(得分:0)
我会改变整体方法并使用相同的视图,因为看起来你可能想要一遍又一遍地计算。 获取索引方法只是为了显示要处理的数据和/或结果,然后是发布方法来进行实际处理。
所以,控制器:
[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>
}