ASP. NET Core MVC Bind Viewmodel, который содержит 2 модели домена - PullRequest
0 голосов
/ 01 августа 2020

Я работаю над простым веб-приложением с ASP. NET Core 3.1 MVC Framework и Entity Framework Core.

У меня есть 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 всегда ложно.

1 Ответ

0 голосов
/ 01 августа 2020

Я создал для вас образец и скрипт таблицы. Пожалуйста, проверьте этот URL 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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...