簡體   English   中英

MVC @Html.HiddenFor 呈現沒有值的 html 表單

[英]MVC @Html.HiddenFor renders html form with no value

注意,在您閱讀其余部分之前

這個問題與 POST方法、重新顯示帶有提交表單的視圖或將輸入值綁定到控制器方法參數無關 這純粹是關於使用 html 幫助程序( HiddenForHidden - 兩者返回相同)呈現視圖


我使用HiddenFor助手創建了一個簡單的隱藏字段

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

我的問題是這個隱藏字段的值呈現為空:

<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。 WORKS ,但它只是解決方法,而不是問題的答案。
  • 在視圖中復制帶有助手的行,如下所示:
@Html.HiddenFor(m => m.ProductCode)
@Html.HiddenFor(m => m.ProductCode)

PARTIALLY WORKS 將第一個輸入作為value/>和第二個作為value="8888888"/> ,這表明可能存在隱藏初始屬性值的東西。 無論如何,我在任何時候都沒有在 ViewData 中找到任何內容,也沒有在 query string 中找到 顯然我不能接受這種方式,我猜不需要解釋。

  • 更改屬性名稱。 最初它是ProductCode 我將其更改為productCode、ProdCode、ProductCodeasd 等,以及所有這些WORKS 同樣,看起來有些東西可以隱藏/更新該值,但同樣 - 100% 確定沒有 JS 或其他任何東西在做這件事。 所以仍然沒有找到答案 - 再次解決方法
  • 顯式設置 HiddenFor 的值:@Html.HiddenFor(x => x.ProductCode, new {Value = @Model.ProductCode})。 NO EFFECT ,以同樣的方式呈現。
  • 使用@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM