2016-09-08 3 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; } 
} 

Я попытался назначить Перевозчика и производителя в методе Create, но это все еще приводило к неудачной проверке.

+0

Вы видели, почему это отмечено как недействительное? –

+0

Пожалуйста, уточните свой вопрос с кодом просмотра. Трудно угадать ответ, не глядя на ваше мнение. – Jayee

+0

Неправильная практика отправки модели для просмотра. Создайте класс VIewmodel и отправьте его в представление. – Jayee

ответ

0

У вас не должно быть атрибутов [Required] свойств навигации (Manufacturer и Carrier).

Вместо этого сохраните его на свойствах ManufacturerNumber и CarrierNumber, потому что вы получаете значения для этих столбцов из пользовательского интерфейса.

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; } 
} 

Также нет необходимости включать DeviceNumber внутри Bind в качестве значения для этого будет автоматически генерироваться. Это должно быть достаточно хорошо.

[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. Это также помогает поддерживать слабосвязанные слои.

Смежные вопросы