Внимание, прежде чем читать остальные
Этот вопрос не о методе 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 );
}
Наконец, что может вызвать такое странное поведение? У меня уже закончились варианты. Может быть, у кого-то была такая же проблема, как у меня раньше, был бы признателен за подсказку по этому делу.