我正在使用MVC在视图中显示简单表单:
ViewModel:
public class CreateSaleViewModel
{
public string OrderId { get; set; }
public decimal TotalAmount { get; set; }
public bool ShowInstoreConfirmDetails { get; set; }
}
控制器动作:
[HttpGet]
public IActionResult CreateSale()
{
return View(new CreateSaleViewModel());
}
查看:
@model CreateSaleViewModel
<form asp-controller="Sales" asp-action="CreateSale" method="post">
<input asp-for="OrderId" />
<input asp-for="TotalAmount" />
<button type="submit" name="CreateSale" id="CreateSale">
button
</button>
</form>
然后我发布到一个新视图,在该视图中需要输入相同的详细信息。为此,我将旧值存储在隐藏的输入中,并提供另一种形式以重新输入详细信息。
ViewModel:
public class ConfirmDetailsViewModel
{
public string OrderId { get; set; }
public decimal TotalAmount { get; set; }
public string ConfirmOrderId { get; set; }
public decimal ConfirmTotalAmount { get; set; }
}
控制器:
[HttpPost("Confirmdetails")]
public IActionResult ConfirmDetails(CreateSaleViewModel model)
{
var viewModel = new ConfirmDetailsViewModel
{
ConfirmOrderId = model.OrderId,
ConfirmTotalAmount = model.TotalAmount,
OrderId = string.Empty,
TotalAmount = 0.0m
};
return View("ConfirmDetails", viewModel);
}
查看:
@model ConfirmDetailsViewModel
<form asp-controller="Sales" asp-action="Summary" method="post">
<input type="hidden" value="@Model.ConfirmOrderId" id="OrderIdConfirm" />
<input type="hidden" value="@Model.ConfirmTotalAmount" id="TotalAmountConfirm" />
<input type="hidden" value="@Model.OrderId" id="banana" />
<input asp-for="OrderId" />
<input asp-for="TotalAmount" />
<button type="submit" name="CreateSale" id="CreateSale">
button
</button>
</form>
我的问题是在confirmdetails视图中orderId和TotalAmount保留了从上一页发布的值。
我已经调试了控制器,可以看到ConfirmOrderId和ConfirmTotalAmount属性具有正确的值,并且OrderId和TotalAmount分别为空strign和0。
甚至是那个陌生人
<input type="hidden" value="@Model.OrderId" id="banana" />
具有正确的“”值。
有人知道导致此问题的原因吗?
答案 0 :(得分:1)
MVC将回发的值存储在ModelState中。
为方便起见,在@Html帮助器中默认使用这些值。这样就可以通过回发来保留隐藏表单字段的值,即使它们在视图模型中没有属性也是如此。
不幸的是,如果您尝试在操作中修改模型的属性,通常的便利便变成了头痛。 助手从ModelState中获取其值,而忽略了更新后的视图模型。
要解决此问题,请致电ModelState.Clear()
控制器:
[HttpPost]
public IActionResult ConfirmDetails(CreateSaleViewModel model)
{
var viewModel = new ConfirmDetailsViewModel
{
ConfirmOrderId = model.OrderId,
...
};
ModelState.Clear(); // force asp-helpers to use the updated model's values
return View("ConfirmDetails", viewModel);
}