Ограниченное свойство вида Razor не обновляется после публикации - PullRequest
0 голосов
/ 25 января 2019

Я не могу получить свойство Price в приведенном ниже примере с бритвой для обновления после выполнения OnPostOrder(). Я написал этот пример представления, чтобы сделать следующее:

  • При изменении списка выбора товаров отправьте ProductForm, используя jquery's submit().
  • Используйте asp-page-handler, чтобы нажать OnPostOrder() при отправке ProductForm. Примечание : в моей реализации это работает, извиняюсь, если в моем примере есть проблема с синтаксисом.
  • Я получаю все параметры продукта из пользовательской статической функции, а затем получаю соответствующий продукт по productid.
  • Я установил цену соответствующего товара в свойстве Price. Однако это не обновляет свойство 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 генерирует атрибуты HTML name и value. Но когда я отлаживаю страницу после OnPostOrder(), я могу нажать <input asp-for="OrderAmount" />.

1 Ответ

0 голосов
/ 25 января 2019

Это происходит потому, что при рендеринге разметки входного элемента помощник по тегу ввода сначала проверяет словарь состояния модели на наличие любых значений и, если он найдет значение для этого свойства, будет использоваться.По этой причине вы видите исходное значение, переданное из элемента ввода через форму отправки.

Решение состоит в том, чтобы удалить этот конкретный элемент из словаря состояния модели.Для этого вы можете использовать метод ModelState.Remove.

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

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

Я также предлагаю вам использовать правильные типы для ваших свойств.Если вы имеете дело с числовыми значениями, используйте строковый числовой тип, например int или decimal.

...