【问题标题】:ASP.NET Core MVC Bind Viewmodel that contains 2 Domain ModelASP.NET Core MVC 绑定包含 2 个域模型的 Viewmodel
【发布时间】:2020-08-01 13:43:17
【问题描述】:

我正在使用 ASP.NET Core 3.1 MVC Framework 和 Entity Framework Core 开发一个简单的 Web 应用程序。

我有 2 个域模型:RenterAddress,以及一个视图模型 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 需要 IdAddress 因为外键约束。

我的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


【解决方案1】:

我为您创建了示例和表格脚本。请查看此网址https://gofile.io/d/yorkiv

我使用scaffold-dbcontext来生成dbcontext和模型。

HomeController.cs

[HttpPost]
    public IActionResult Index(Address address, Renter renter)
    {
        using (var context = new TestDBContext())
        {
            address.Renter.Add(renter);
            context.Add(address);
            context.SaveChanges();
        }
        return View();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多