ASP.NET Core MVC模型属性绑定为null

时间:2016-06-09 13:54:47

标签: c# asp.net-core asp.net-core-mvc

我正在使用带有Entity Framework的ASP.NET Core RC2 MVC并尝试保存新车。问题是,在回发操作时,在汽车控制器的create方法中,属性颜色 null 。所有其他属性/字段都已设置。但是引用 CarColors 模型的Color为null。

CarColor模型

public class CarColor
{
    [Key]
    public int CarColorId { get; set; }

    [MinLength(3)]
    public string Name { get; set; }

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

主要车型

public class Car
{
    [Key]
    public int CarId { get; set; }

    [MinLength(2)]
    public string Name { get; set; }

    [Required]
    public DateTime YearOfConstruction { get; set; }

    [Required]
    public CarColor Color { get; set; }
}

汽车控制器

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Color,Name,YearOfConstruction")] Car car)
{
    if (ModelState.IsValid)
    {
        _context.Add(car);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(car);
}

请求数据:

post request data

调试已发布汽车的屏幕截图

debugging screenshot

你可以帮我一下,财产如何“绑定”,所以 ModelState.IsValid == true

2 个答案:

答案 0 :(得分:3)

如果要填充Car模型的Color属性,则您的请求必须如下所示:

[0] {[Name, Volvo]}
[1] {[Yearof Construction, 19/16/2015]}
[2] {[Color.CarColorId, 3]} (will be "bound" only ID)

表示:View上的输入/选择名称必须为“Color.CarColorId”。

...但你选择了不正确的方法。您不应直接在视图中使用域模型。您应该为View和您的操作方法的传入属性创建特殊的视图模型。

正确的方式

域模型(不做更改):

public class CarColor
{
    [Key]
    public int CarColorId { get; set; }

    [MinLength(3)]
    public string Name { get; set; }

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

public class Car
{
    [Key]
    public int CarId { get; set; }

    [MinLength(2)]
    public string Name { get; set; }

    [Required]
    public DateTime YearOfConstruction { get; set; }

    [Required]
    public CarColor Color { get; set; }
}

查看型号:

public class CarModel
{    
    [MinLength(2)]
    public string Name { get; set; }

    [Required]
    public DateTime YearOfConstruction { get; set; }

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

控制器:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(CarModel model)
{
    if (ModelState.IsValid)
    {
        var color = await _context.Colors.FirstAsync(c => c.CarColorId == model.ColorId, this.HttpContext.RequestAborted);
        var car = new Car();
        car.Name = model.Name;
        car.YearOfConstruction = model.YearOfConstruction;
        car.Color = color;

        _context.Cars.Add(car);
        await _context.SaveChangesAsync(this.HttpContext.RequestAborted);
        return RedirectToAction("Index");
    }
    return View(car);
}

答案 1 :(得分:0)

就我而言,我在模型类上自动生成了internal set属性。框架无法绑定这些。也许这篇文章会对以后的某个人有所帮助,因为花了我一段时间才弄清楚;)