在执行OnPostOrder()
之后,无法在下面的示例剃刀视图中获取属性Price来进行更新。我编写了此示例视图以执行以下操作:
submit()
提交ProductForm。 asp-page-handler
击中OnPostOrder()
。 注意:如果我的示例中存在语法问题,这在我的实现中有效。示例视图:
@page
@{
@functions{
[BindProperty] public string Product { get; set; }
[BindProperty] public decimal Price { get; set; }
public void OnPostOrder()
{
Price = 25.00;
}
}
List<ProductOption> productOptions = AdminUtil.GetProductOptions();
SelectList productOptionSelectList = new SelectList(productOptions, "ProductId", "Name");
}
<form method="post" id="ProductForm" asp-page-handler="order">
Product: <select asp-for="Product" asp-items="@productOptionSelectList"></select> <br />
Order Amount: <input asp-for="Price" /> <br />
</form>
@section Scripts {
<script>
$(function () {
$('#Product').on('change', function () {
$("#ManualOrderForm").submit();
});
});
</script>
}
我是剃刀页面的新手,所以如果这是一个重复的问题,请指出正确的方向。我没有找到类似的示例,但我可能没有搜索正确的术语。
似乎有意义的一个原因是asp-for
生成HTML name
和value
属性。但是当我在OnPostOrder()
之后调试页面时,我可以点击<input asp-for="OrderAmount" />
。
答案 0 :(得分:2)
之所以发生这种情况,是因为在呈现输入元素标记时,输入标签帮助程序会首先检查模型状态字典中是否有任何值,如果找到该属性的值,则将使用该值。这就是您看到通过表单提交从input元素传递的原始值的原因。
解决方案是从模型状态字典中删除此特定项目。您可以使用ModelState.Remove
方法。
public IActionResult OnPost()
{
this.Price = 25;
ModelState.Remove("Price"); // This line does the trick
return Page();
}
我还建议您对属性使用正确的类型。如果要处理数字值,请使用数字类型,例如int
或decimal
代替字符串。