MVC:向自己提交视图-避免返回URL中的模型属性值



我是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>
}

最新更新