我正在使用带有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);
}
请求数据:
调试已发布汽车的屏幕截图
你可以帮我一下,财产如何“绑定”,所以 ModelState.IsValid == true ?
答案 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
属性。框架无法绑定这些。也许这篇文章会对以后的某个人有所帮助,因为花了我一段时间才弄清楚;)