【问题标题】:code first create post代码先创建帖子
【发布时间】:2016-09-08 22:48:49
【问题描述】:

我正在尝试使用代码优先数据库在 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 中的错误总是告诉我 Manufacturer 和 Carrier 为空,但它们是必需的。

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 方法中分配运营商和制造商,但仍然导致验证失败。

【问题讨论】:

  • 你看到为什么被标记为无效了吗?
  • 请使用查看代码更新您的问题。不看你的观点很难猜出答案。
  • 将模型发送到视图不是一个好习惯。创建一个 VIewmodel 类并将其发送到视图。

标签: c# asp.net-mvc ef-code-first


【解决方案1】:

导航属性(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; }
}

也没有必要在Bind 中包含DeviceNumber,因为它的值将自动生成。这应该足够了。

[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。这也有助于保持层松散耦合。

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2021-04-21
    相关资源
    最近更新 更多