簡體   English   中英

ASP.Net MVC索引輸入未綁定到POST上的模型

[英]ASP.Net MVC Indexed Inputs Not Binding To Model On POST

我正在嘗試使用以下內容將數據發布回我的控制器,但是模型列表始終以null形式發布回。

我檢查了呈現的html,它對我來說似乎有效,但是也許我遺漏了一些東西。 以前從未做過此事,我認為如果輸入與模型匹配,則它將自動綁定。

剃刀視圖

    @for (int i = 0; i < Model.Addons.Count; i++)
{
    if (Model.Addons[i].AddonType == AddonType.Bacon)
    {
        <div>
            @Html.HiddenFor(x => Model.Addons[i].Id)
            @Html.TextBoxFor(x => Model.Addons[i].Quantity, new { @style = "width: 40px", @class = "form-control calculated", data_price = Model.Addons[i].Price })
            @Model.Addons[i].Name
            @(" ($")@Model.Addons[i].Price@(")")
        </div><br />
    }
}

產生的HTML

    <div class="form-group" id="FoodPlatter">
                <input class="form-control calculated" data-price="30.00" data-val="true" data-val-number="The field Quantity must be a number." data-val-required="The Quantity field is required." id="Addons_32__Quantity" name="Addons[32].Quantity" style="width: 40px" type="text" value="0">
<input class="form-control calculated" data-price="21.00" data-val="true" data-val-number="The field Quantity must be a number." data-val-required="The Quantity field is required." id="Addons_33__Quantity" name="Addons[33].Quantity" style="width: 40px" type="text" value="0">
<input class="form-control calculated" data-price="30.00" data-val="true" data-val-number="The field Quantity must be a number." data-val-required="The Quantity field is required." id="Addons_34__Quantity" name="Addons[34].Quantity" style="width: 40px" type="text" value="0">
    </div>

模型

public class BaconOrderModel {
        public List<Addon> Addons { get; set; }
}

public class Addon
{
    public int Id { get; set; }
    public AddonType AddonType { get; set; } // ENUM
    public string Name { get; set; }
    public decimal Price { get; set; }
    public int Quantity { get; set; }
    public bool IsSelected { get; set; }
}

調節器

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(BaconOrderModel model)
{
    var baconOrder = new BaconOrder();
    foreach (var addon in model.Addons)
    {
        if (addon.IsSelected)
        {
            baconOrder.Addons.Add(new Addon
            {
                AddonId = addon.Id,
                Quantity = addon.Quantity
            });
        }
    }

    _baconOrderService.Add(baconOrder);
    return RedirectToAction("Index");
}

我認為問題是您的索引需要從0開始連續進行。因為您要計算i並過濾第一個項目的索引是在32上。

索引器需要從0開始並且是連續的。

作為對您的最后評論的答復:

我認為默認綁定模型就是這樣工作的。 有關模型綁定的介紹,請參見http://msdn.microsoft.com/zh-cn/magazine/hh781022.aspx

您可以使用此語法包括/ exclude屬性,這也有助於降低惡意攻擊的風險。

public ActionResult Edit([Bind(Include = "Name")]Student student)
{
    ...
}

但是,在大多數情況下,我使用簡單的視圖模型,該模型僅攜帶所需的數據。

經過幾次嘗試和下面的建議,我意識到這里的根本問題是索引。 挑戰在於我的列表按類型(枚舉)分組,並且我通過此枚舉類型呈現表單的每個部分。 由於我在主列表中獲取值的位置,索引不按順序排列。 目前,我已將問題修復如下:

俯視

@{ var index = 0; } 

每個部分(ADDONTYPE)

                @for (int i = 0; i < Model.Addons.Count; i++)
                {
                    if (Model.Addons[i].AddonType == AddonType.BaconStrips) // AddonType is enum.
                    {
                        <div>
                            @Html.Hidden("BaconAddons[" + index + "].Id", Model.Addons[i].Id)
                            @Html.Hidden("BaconAddons[" + index + "].AddonType", Model.Addons[i].AddonType)
                            @Html.Hidden("BaconAddons[" + index + "].Name", Model.Addons[i].Name)
                            @Html.Hidden("BaconAddons[" + index + "].Price", Model.Addons[i].Price)
                            @Html.TextBox("BaconAddons[" + index + "].Quantity", Model.Addons[i].Quantity, new { @style = "width: 40px", @class = "form-control calculated", data_price = Model.Addons[i].Price })
                            @Model.Addons[i].Name
                            @(" ($")@Model.Addons[i].Price@(")")
                        </div><br />
                        { index++; }
                    }
                }

我想知道這是否是最好的方法? 我試圖在模型中創建另一個要綁定的空列表,但是似乎拋出了“ Out Of Range”異常。 我想知道是否有更好的方法?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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