2016-09-08 84 views
0

我正在嘗試在ASP.NET MVC中使用代碼優先數據庫創建新的數據庫記錄。我使用腳手架和視圖爲模型創建了控制器,並且每次嘗試執行POST時創建模型都是無效的,這兩個模型是我嘗試創建的模型的成員始終爲空。代碼先創建帖子

下面是在我的控制器中創建POST的代碼。

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "DeviceNumber,ManufacturerNumber,CarrierNumber,Name")] Device device) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Devices.Add(device); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    ViewBag.CarrierNumber = new SelectList(db.Carriers, "CarrierNumber", "CarrierID", device.CarrierNumber); 
    ViewBag.ManufacturerNumber = new SelectList(db.Manufacturers, "ManufacturerNumber", "ManufacturerID", device.ManufacturerNumber); 
    return View(device); 
} 

以下是我嘗試創建的模型。 ModelState中的錯誤總是告訴我製造商和運營商是空的,但它們是必需的。

public class Device 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int DeviceNumber { get; set; } 

    [ForeignKey("ManufacturerNumber"), Required] 
    public virtual Manufacturer Manufacturer { get; set; } 

    public int ManufacturerNumber { get; set; } 

    [ForeignKey("CarrierNumber")] 
    [Required] 
    public virtual Carrier Carrier { get; set; } 

    public int CarrierNumber { get; set; } 

    [Required] 
    public string Name { get; set; } 
} 

我已經嘗試在創建方法中分配載體和製造商,但它仍導致驗證失敗。

+0

你有沒有看到爲什麼被標記爲無效? –

+0

請使用查看代碼更新您的問題。不看你的觀點就很難猜出答案。 – Jayee

+0

發送模型進行查看並不是一個好習慣。創建一個VIewmodel類並將其發送到視圖。 – Jayee

回答

0

導航屬性(ManufacturerCarrier)上不應具有[Required]屬性。

請將它保留在ManufacturerNumberCarrierNumber屬性上,因爲您從UI獲取這些列的值。

public class Device 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int DeviceNumber { get; set; } 

    [ForeignKey("ManufacturerNumber")] 
    public virtual Manufacturer Manufacturer { get; set; } 

    [Required] 
    public int ManufacturerNumber { get; set; } 

    [ForeignKey("CarrierNumber")] 
    public virtual Carrier Carrier { get; set; } 

    [Required] 
    public int CarrierNumber { get; set; } 

    [Required] 
    public string Name { get; set; } 
} 

也沒有必要列入DeviceNumberBind作爲此值會自動生成。這應該足夠好。

[HttpPost] 
public ActionResult Create([Bind(Include = "ManufacturerNumber,CarrierNumber,Name")] 
                       Device device) 
{ 
// your code 
} 

這應該可以正常工作,假設您的視圖具有爲所需字段發送數據的表單。

@model Device 
@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(false) 

    @Html.LabelFor(f=>f.Name) 
    @Html.TextBoxFor(f=>f.Name) 

    @Html.LabelFor(f => f.CarrierNumber) 
    @Html.DropDownList("CarrierNumber") 

    @Html.LabelFor(f => f.ManufacturerNumber) 
    @Html.DropDownList("ManufacturerNumber") 

    <input type="submit"/> 
} 

請記住,the best way to prevent over posting is to use a view model。這也有助於保持圖層鬆散耦合。