MVC Core-奇怪的视图渲染问题

时间:2018-07-03 15:13:24

标签: asp.net-mvc asp.net-core-mvc

我正在使用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" />

具有正确的“”值。

有人知道导致此问题的原因吗?

1 个答案:

答案 0 :(得分:1)

MVC将回发的值存储在ModelState中。

为方便起见,在@Html帮助器中默认使用这些值。这样就可以通过回发来保留隐藏表单字段的值,即使它们在视图模型中没有属性也是如此。

不幸的是,如果您尝试在操作中修改模型的属性,通常的便利便变成了头痛。 助手从ModelState中获取其值,而忽略了更新后的视图模型。

要解决此问题,请致电ModelState.Clear()

  • 从ModelState删除所有回发的值
  • 助手现在将使用视图模型中的值。

控制器:

    [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);
    }