[英]MVC @Html.HiddenFor renders html form with no value
這個問題與 POST方法、重新顯示帶有提交表單的視圖或將輸入值綁定到控制器方法參數無關。 這純粹是關於使用 html 幫助程序( HiddenFor或Hidden - 兩者返回相同)呈現視圖。
我使用HiddenFor
助手創建了一個簡單的隱藏字段
@Html.HiddenFor(m => m.ProductCode)
我的問題是這個隱藏字段的值呈現為空:
<input id="productCode" name="productCode" type="hidden" value/>
即使我在實例化模型時設置了它,當然它也通過調試得到確認(它總是有一個值)。
所以它應該是這樣的:
<input id="productCode" name="productCode" type="hidden" value="8888888"/>
因為我知道有一些像這樣的問題(實際上所有這些問題都是指在表單 POST 期間更改表單值)我列出了我已經嘗試過的事情。 我的代碼就在這部分的正下方,我認為這是必不可少的。
HiddenFor
助手,而是使用純 html。 WORKS ,但它只是解決方法,而不是問題的答案。@Html.HiddenFor(m => m.ProductCode)
@Html.HiddenFor(m => m.ProductCode)
PARTIALLY WORKS 將第一個輸入作為value/>
和第二個作為value="8888888"/>
,這表明可能存在隱藏初始屬性值的東西。 無論如何,我在任何時候都沒有在 ViewData 中找到任何內容,也沒有在 query string 中找到。 顯然我不能接受這種方式,我猜不需要解釋。
@Html.Hidden
而不是@Html.HiddenFor
。 NO EFFECT ,名稱設置為ProductCode它呈現相同的方式。 我發現有趣的另一件事。 在 Chrome [ctrl+U]中使用Display page source讀取 html顯示value 是有效value="8888888"/>
,但在 DevTools 中它仍然是value/>
並且當然提交表單將 null 傳遞給 Controller 方法。
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;
}
}
@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>
}
視圖是從控制器返回的 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 );
}
最后,是什么導致了這種奇怪的行為? 我已經沒有選擇了。 也許任何人以前都遇到過像我這樣的問題,希望對此案有任何線索。
我調試了渲染視圖的整個過程(進入 .Net 源)檢查每個可能導致它失敗的地方,但什么也沒找到。
在@AndyMudrak 和@Jeremy Lakeman 發表評論后,我決定再次嘗試找到對這種行為負責的 JavaScript,但比以前更深入。 我發現的是一個非常愚蠢的腳本,其中元素 Id 是從我沒想到的三個字符串中連接起來的,因為它的實現非常糟糕。 所以最后 - JavaScript 正在這樣做,並且框架等沒有不良行為。
實際上我有點失望(即使知道這個簡單的答案很好)因為它看起來比實際復雜得多,而且我花了幾個小時才發現它有多簡單:|
感謝您的評論,抱歉最后的簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.