MVC @ Html .HiddenFor отображает html форму без значения - PullRequest
5 голосов
/ 27 января 2020

Внимание, прежде чем читать остальные

Этот вопрос не о методе POST , отображает представление с субмитированной формой или привязывает входные значения к параметрам метода контроллера. Это всего лишь рендеринг View с использованием html helper ( HiddenFor или Hidden - оба возвращают одно и то же).


I Я создал простое скрытое поле, используя HiddenFor helper

@Html.HiddenFor(m => m.ProductCode)

, и моя проблема в том, что значение для этого скрытого поля отображается как null:

<input id="productCode" name="productCode" type="hidden" value/>

Даже если я установлю его при создании экземпляра модели и, конечно, это будет подтверждено отладкой ( всегда имеет значение ). Поэтому вместо этого это должно выглядеть так:

<input id="productCode" name="productCode" type="hidden" value="8888888"/>

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


Пока я пытался:

  • ModelState.Clear () везде, где это возможно - потому что, как мы знаем, значение из ModelState является первым местом, где оно ищет значение . НЕТ ЭФФЕКТА , который я ожидал, потому что мой ModelState пуст (мой случай не об изменении значения во время POST в контроллере, как во многих подобных вопросах), поэтому он должен принимать значение из моей модели представления.
  • Не использовать HiddenFor помощник, но вместо этого чистый html. РАБОТАЕТ , но его просто обходной путь , а не решение проблемы.
  • Дублирование строки с представлением помощника следующим образом:
@Html.HiddenFor(m => m.ProductCode)
@Html.HiddenFor(m => m.ProductCode)

ЧАСТИЧНО РАБОТАЕТ Создает первый ввод как value/>, а второй как value="8888888"/>, что указывает на то, что, возможно, что-то скрывает начальное значение свойства. В любом случае, Я не нашел ничего ни в ViewData, ни в строке запроса . Очевидно, я не могу принять это таким образом, объяснение не нужно, я думаю.

  • Изменение имени свойства. Первоначально это был ProductCode . Я изменил его на productCode, ProdCode, ProductCodeasd, et c. и все эти WORKS . Опять же, похоже, что есть что-то, что скрывает / обновляет значение, но опять же - на 100% уверен, что нет JS или чего-либо еще, что делает это. Так что до сих пор не найдено ответа - просто обходной путь снова.
  • Явное задание значения для HiddenFor: @ Html .HiddenFor (x => x.ProductCode, new {Value = @ Model.ProductCode}). НЕТ ЭФФЕКТА , визуализируется таким же образом.
  • Использование @Html.Hidden вместо @Html.HiddenFor. НЕТ ЭФФЕКТА , с именем, установленным как ProductCode , он воспроизводится аналогичным образом.

Еще одна вещь, которая мне показалась интересной. Чтение html с Отображение источника страницы в Chrome [ctrl + U] показывает, что значение действительно value="8888888"/>, но в DevTools он по-прежнему value/> и, конечно, при отправке формы метод Controller теряет значение *


Model

public class Product
    {
        public string Description { get; set; }
        public int Quantity { get; set; }
        public string ProductCode { get; set; }
        public string ImageUrl { get; set; }

        public Product(string desc, string productCode, string imgUrl)
        {
            Description = desc;
            ProductCode = productCode;
            ImageUrl = imgUrl;
        }
    }

View

@model Product

@using (Html.BeginForm("UpdateCart", "Cart"))
{
    <div class="row pad10">

        <div class="col-sm-6 text-center">
            <img src="@Model.ImageUrl" width="300" height="300" />
        </div>
        <div class="col-sm-6 text-justify">
            <p>@Model.Description</p>
            <div class="row padding-top-2">
                <div class="col-sm-6">
                    <label>@CommonResources.Quantity: </label>
                </div>
                <div class="col-sm-4">
                    @Html.TextBoxFor(m => m.Quantity, new
                    {
                        @class = "form-control",
                        @data_val_required = CommonResources.FieldRequired,
                        @data_val_number = CommonResources.ValidationNumber
                    })
                    @Html.ValidationMessageFor(model => model.Quantity, "", new { @class = "text-danger" })
                    @Html.HiddenFor(m => m.ProductCode)
                </div>
            </div>
        </div>
    </div>
    <div class="text-center col-xs-12 padTop20 padBottom20">
        <input type="submit" value="Submit" class="whtBtn pad" />
    </div>
}

Controller

Представление возвращается из контроллера с RedirectToAction следующим образом: ValidateAndProceed -> ResolveNextStep (здесь происходит перенаправление) -> ShowProduct

        public ActionResult ValidateAndProceed()
        {
            var order = Session.Current.Order;
            var lang = LangService.GetSelectedLanguage();
            var invoice = Session.Current.CurrentInvoice;
            var localCurrency = Session.Current.LocalCurrencyInfo;

            List<CheckoutValidationFieldError> errors = new List<CheckoutValidationFieldError>();

            errors = ValidationService.ValidateAddress(order);
            if (errors.Count > 0)
            {
                return RedirectToAction("InvalidAddress", "Address", new { serializedErrors = JsonConvert.SerializeObject(errors) });
            }

            return ResolveNextStep(order, invoice);
        }

        public ActionResult ResolveNextStep(IOrder order, IInvoice invoice)
        {
            if (OrderService.ShowProductView(order, invoice))
            {
                return RedirectToAction("ShowProduct");
            }
            return RedirectToAction("Summary");
        }

        public ActionResult ShowProduct()
        {
            Product model = ProductService.GetProduct(Session.Current.CurrentInvoice);
            return View("~/Views/Product.cshtml", model );
        }

Наконец, что может вызвать такое странное поведение? У меня уже закончились варианты. Может быть, у кого-то была такая же проблема, как у меня раньше, был бы признателен за подсказку по этому делу.

1 Ответ

2 голосов
/ 31 января 2020

Я отлаживал весь процесс рендеринга вида (попал в. Net источники), проверяя каждое возможное место, которое могло привести к сбою, и ничего не нашел.

После комментариев @AndyMudrak и @Jeremy Lakeman я решил снова попытаться найти JavaScript, ответственную за это поведение, но глубже, чем я делал раньше. То, что я нашел, было действительно глупым скриптом, в котором элемент Id объединяется из трех строк, чего я не ожидал, потому что он действительно плохо реализован. Итак, наконец - JavaScript делает это, и в фреймворке нет плохого поведения и т. Д. c.

На самом деле я немного разочарован (даже если полезно знать этот простой ответ), потому что он выглядел гораздо более сложнее, чем на самом деле, и мне потребовались часы, чтобы понять, насколько это просто: |

Спасибо за комментарии, извините за окончательную простоту.

...