【发布时间】:2020-08-01 13:43:17
【问题描述】:
我正在使用 ASP.NET Core 3.1 MVC Framework 和 Entity Framework Core 开发一个简单的 Web 应用程序。
我有 2 个域模型:Renter 和 Address,以及一个视图模型 RenterViewModel:
public class Renter
{
public int Id { get; set; }
[Required]
public Type RenterType { get; set;}
public string CompanyName { get; set;}
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set;}
[Required]
public Address Address {get; set;}
public int AddressId {get; set;}
}
public class Address
{
public Address()
{ }
public int Id { get; set; }
[Required]
public string Street { get; set; }
[Required]
public string StreetNumber { get; set; }
[Required]
public string PostalCode { get; set; }
[Required]
public string City { get; set; }
}
public class RenterViewModel
{
public RenterViewModel(Renter renter, Address address)
{
this.Renter = renter;
this.Address = address;
}
public Renter Renter {get; set;}
public Address Address {get; set;}
}
对于我的索引视图和详细信息视图,这可以正常工作。
如何在控制器中绑定此视图模型并对其进行验证,以便先将Address 存储到数据库,然后再将Renter 存储到数据库?
Renter 需要 Id 的 Address 因为外键约束。
我的RenterController Create 方法如下所示:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,RenterType,CompanyName,FirstName,LastName"), prefix="Renter"] Renter renter,
[Bind("Street, StreetNumber, City, Postalcode"), prefix="Address"] Address address)
{
if (ModelState.IsValid)
{
_context.Add(address);
renter.Address_Id = address.id;
_context.Add(renter);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
return View(new RenterViewModel(renter, address));
}
问题是ModelState.IsValid 总是假的。
【问题讨论】:
-
我认为 ModelState 不适用于嵌套模型,而仅适用于第一级。您需要创建自定义验证。
-
实体框架会在插入时处理外键,因此您无需担心首先保存地址。您可以自己进行验证。您可能想查看FluentValidation。
-
你真的不需要视图模型。只是标准的实体框架模型就可以了。实体框架核心可以处理一切。如果您在数据库中有他们的关系,它将为您插入外国 ID。你只需要 2 行来保存租户和地址是 _context.Add(address);等待 _context.SaveChangesAsync();
标签: c# entity-framework-core asp.net-core-mvc