簡體   English   中英

下拉列表值未在創建MVC 5上發布

[英]Drop Down List value is not posting on create MVC 5

如果這是一個愚蠢的問題,我深表歉意,但我很沮喪。 這是我嘗試的第一個MVC應用程序,來自Web表單。 我有以下型號:

public class IndividualItem
{
    [Required][Key]
    public string SerialNumber { get; set; }
    public virtual NSN NSNnumber { get; set; }
    public string Location { get; set; }
    public string User { get; set; }
}

public class NSN
{
    [Required][DisplayName("NSN")][StringLength(13)][Key]
    public string NSNnumber { get; set; }
    [Required]
    [StringLength(100)]
    [DisplayName("NSN Description")]
    public string Description { get; set; }
    public virtual ICollection<IndividualItem> Items { get; set; }
}

這是視圖模型

public class IndividualItemNSNselectList
{
    public SelectList NSNlist { get; set; }
    public IndividualItem IndividualItem { get; set; }
}

控制者

public ActionResult Create()
    {
        var view = new IndividualItemNSNselectList();
        view.NSNlist = new SelectList(db.NSNs.ToList(),"NSNnumber","Description");
        return View(view);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "SerialNumber,Location,User")] IndividualItem individualItem)
    {
        if (ModelState.IsValid)
        {
            db.IndividualItem.Add(individualItem);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(individualItem);
    }

然后放下

<div class="form-group">
            @Html.LabelFor(model => model.IndividualItem.NSNnumber, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.IndividualItem.NSNnumber,Model.NSNlist, " ")
                @Html.ValidationMessageFor(model => model.IndividualItem.NSNnumber, "", new { @class = "text-danger" })
            </div>
        </div>

當我嘗試為IndividualItem創建create視圖時,一切都會起作用,包括下拉列表的填充。 但是,當我發布時,NSN對象沒有被輸入到數據庫中。

我做了很多研究,將我引向了這一點,但是我無法弄清楚哪里出了問題。 感謝您的協助,如果您需要我進行說明,請告訴我。

您的代碼中有多個錯誤,並且有一些不良做法。

首先,您不能將<select>綁定到復雜對象的屬性(它僅回發一個簡單值-所選選項的值)。 假設您要綁定到NSNNSNnumber ,則視圖代碼需要為

@Html.DropDownListFor(m => m.IndividualItem.NSNnumber.NSNnumber, Model.NSNlist, "")

正如Saket所指出的。

其次,視圖中的模型是IndividualItemNSNselectList ,這意味着POST方法參數中的模型也必須是IndividualItemNSNselectList 您的POST方法簽名應為

public ActionResult Create IndividualItemNSNselectList model)

並且在POST方法中得到任何東西的唯一原因是因為您將參數命名為與屬性相同的屬性,這可能導致其他問題,包括以下事實:由於ModelState無效,當您返回視圖時,您將獲得異常(請參閱模型傳遞到字典中的item類型是..,但此字典需要一個類型為更多的模型項 ),因為您將IndividualItem的實例傳遞回一個視圖,期望該視圖具有IndividualItemNSNselectList

通過正確使用視圖模型,可以輕松解決所有這些問題。 視圖模型不應包含作為數據模型的屬性,而應僅包含要在視圖中顯示/編輯的數據模型的屬性。 另外,使用視圖模型時,您不需要[Bind]屬性,因為您已經防止了過度發布攻擊。請參閱MVC中的ViewModel是什么?

您的[Bind]屬性建議您只有4個屬性,因此您的視圖模型應該是(根據需要添加顯示和驗證屬性)

public class IndividualItemVM
{
    public string SerialNumber { get; set; }
    public string NSNnumber { get; set; }
    public string Location { get; set; }
    public string User { get; set; }
    public IEnumerable<SelectListItem> NSNlist { get; set; }
}

然后視圖變成

@Html.DropDownListFor(m => m.NSNnumber, Model.NSNlist, "", new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.NSNnumber, "", new { @class = "text-danger" })

POST方法簽名現在變為

public ActionResult Create IndividualItemVM model)

在該方法中,您將創建數據模型的新實例,並從視圖模型映射它們的屬性並保存。

此外,還必須在返回視圖之前重新填充SelectList ,否則當前代碼將發生另一個異常, 如ViewData項中所述,鍵“ XXX”的類型為“ System.Int32”,但類型為“ IEnumerable” 附帶說明,在查詢中使用.ToList()來生成SelectList是不必要的。

您的代碼需要進行兩項修改:

變更1:下拉列表應綁定到屬性而不是類

將您的下拉菜單更新為:

@Html.DropDownListFor(model => model.IndividualItem.NSNnumber.NSNnumber, Model.NSNlist, " ")

變更2:

操作方法中的綁定屬性缺少要綁定的必需屬性。 如下更新您的后處理方法:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "SerialNumber,Location,User,NSNnumber")] IndividualItem individualItem)
{
}

或者,如果您打算排除屬性,請進行如下修改:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Exclude= "SerialNumber,Location,User")] IndividualItem individualItem)
{
}

希望這對您有用。 我自己驗證了。

暫無
暫無

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

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