Razor 视图的有界属性在发布后未更新

2024-05-08

我无法在下面的示例剃刀视图中获取属性价格以进行更新OnPostOrder()执行。我编写此示例视图是为了执行以下操作:

  • 在更改产品选择列表时,使用 jquery 提交 ProductFormsubmit().
  • Use asp-page-handler to hit OnPostOrder()当提交 ProductForm 时。Note:这在我的实现中有效,如果我的示例中存在语法问题,我们深表歉意。
  • 我从自定义静态函数获取所有产品选项,然后通过 Productid 获取匹配的产品。
  • 我将匹配产品的价格设置为 Price 属性。However,这不会更新 Price 属性。

视图示例:

@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生成 HTMLname and value属性。但是当我调试页面后OnPostOrder()我能够击中<input asp-for="OrderAmount" />.


发生这种情况是因为在渲染输入元素标记时,输入标记帮助程序首先检查模型状态字典中是否有任何值,如果找到该属性的值,则将使用该值。这就是您看到通过表单提交从输入元素传递的原始值的原因。

解决方案是从模型状态字典中删除该特定项目。您可以使用ModelState.Remove方法来做到这一点。

public IActionResult OnPost()
{       
    this.Price = 25;

    ModelState.Remove("Price");  // This line does the trick
    return Page();
}

我还建议您为您的属性使用正确的类型。如果您正在处理数值,请使用数字类型,例如int or decimal而不是字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Razor 视图的有界属性在发布后未更新 的相关文章

随机推荐