EF 3.1 Core (Newb ie) Доступ один ко многим в поле зрения - PullRequest
0 голосов
/ 20 апреля 2020

Я только начал разрабатывать в C#, используя ASP. Net Core и EntityFramework. У меня возникают трудности с попытками выяснить, как получить доступ и сохранить данные моего адреса. Короче говоря, у меня есть компании, у которых есть как минимум два адреса: адрес для выставления счетов и адрес службы.

У меня есть три модели (обратите внимание, я соединил свойства для целей этого поста).

Модель компании:

public int Id {get; set;}
public string Name {get; set;}
public virtual ICollection<Address> Addresses {get; set;}

Модель адреса:

public int Id {get; set;}
public int CompanyId {get; set;}
public string street1 {get; set;} 
public AddressTypeId {get; set;
public AddressType AddressType {get; set;}
public virtual Company Company {get; set;}

Модель типа адреса:

public int Id {get; set;}
public string AddressType {get; set;}

Я использую EF с активной загрузкой. Я могу загрузить свою компанию на основе идентификатора, и я также могу показать РЕДАКТИРОВАТЬ , который содержит все данные о моей компании, но я не знаю, как загрузить разные адреса (выставление счетов и сервис), чтобы их можно было редактировать и возвращать в базу данных. Я только хочу изменить адрес службы и выставления счетов.

Мой контроллер имеет следующий код:

CompanyDetailsViewModel companyDetailsViewModel = new CompanyDetailsViewModel();
var company = _companyRepository.GetCompanyById(id);
var addresses = company.Addresses;
Address serviceAddress = null;
Address billingAddress = null;

foreach (var address in addresses)
   {
     switch (address.AddressType.Display.ToLower())
     {
       case "service":
          serviceAddress = address;
          break;
       case "billing":
          billingAddress = address;
          break;
       }
      }

  companyDetailsViewModel.Company = company;
  companyDetailsViewModel.BillingAddress = billingAddress;
  companyDetailsViewModel.ServiceAddress = serviceAddress;
  return View(companyDetailsViewModel);

Вот что у меня есть в ViewModel

 public Company Company { get; set; }       
    public List<CompanyType> CompanyTypeList { get; set; }
    public List<CompanySource> CompanySourceList { get; set; }
    public List<State> StateList { get; set; }
    public string EncodedAddress { get; set; }
    public Address ServiceAddress { get; set; }
    public Address BillingAddress { get; set; }

И часть View

<input asp-for="@Model.Company.Name" class="form-control" />
<input asp-for="@Model.ServiceAddress.Street1" class="form-control"/>
<input asp-for="@Model.ServiceAddress.Street2" class="form-control" />
<input asp-for="@Model.ServiceAddress.City" class="form-control" />
<select asp-for="@Model.ServiceAddress.StateId" class="form-control"
    asp-items="@(new SelectList(Model.StateList,"Id","StateAbbreviation"))">
</select>
<input asp-for="@Model.ServiceAddress.PostalCode" class="form-control" />

Надеюсь, это имеет смысл. Это немного сложно объяснить.

Обратите внимание, что я знаю, почему данные не обновляются (это потому, что я использую отдельные классы в ViewModel для адресов Service и Billing), но я просто не знать, как подключить тех, кто привел к этому вопросу. : -)

Спасибо большое за помощь.

--- Val

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

В режиме редактирования вам нужно использовать hidden control для хранения текущего поля Company Id, в противном случае вы не будете знать, какой элемент данных в настоящее время изменяется.

Вы должны отобразить все типы адресов на странице, затем измените соответствующие данные и передайте их контроллеру, а затем edit the corresponding address according to the id value.

Подробнее см. В следующем коде. (Я упростил код на основе предоставленных вами полей и использую ядро ​​ef)

Редактировать представление:

@model WebApplication_core_mvc.Controllers.CompanyDetailsViewModel
@{
    ViewData["Title"] = "Edit";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Edit</h1>
<form asp-action="Edit" method="post">
   <input asp-for="@Model.Company.Id" class="form-control" hidden />
   CompanyName: <input asp-for="@Model.Company.Name" class="form-control" />
   BillingAddress:  <input asp-for="@Model.BillingAddress.street1" class="form-control" />
   ServiceAddress: <input asp-for="@Model.ServiceAddress.street1" class="form-control" />
    <input id="Button1" type="submit" value="button" />
</form>
@*<input asp-for="@Model.ServiceAddress.Street2" class="form-control" />
    <input asp-for="@Model.ServiceAddress.City" class="form-control" />
    <select asp-for="@Model.ServiceAddress.StateId" class="form-control"
            asp-items="@(new SelectList(Model.StateList,"Id","StateAbbreviation"))">
    </select>
    <input asp-for="@Model.ServiceAddress.PostalCode" class="form-control" />*@

Контроллер:

public class CompanyAddressController : Controller
{
    private readonly MyDbContext _context;
    public CompanyAddressController(MyDbContext context)
    {
        _context = context;
    }
    public IActionResult Edit(int id)
    {
        CompanyDetailsViewModel companyDetailsViewModel = new CompanyDetailsViewModel();
        var company = _context.CompanyModel.Include(x => x.Addresses).ThenInclude(x => x.AddressType).Where(x => x.Id == id).FirstOrDefault();
        var addresses = company.Addresses;
        AddressModel serviceAddress = null;
        AddressModel billingAddress = null;

        foreach (var address in addresses)
        {
            switch (address.AddressType.AddressType.ToLower())
            {
                case "service":
                    serviceAddress = address;
                    break;
                case "billing":
                    billingAddress = address;
                    break;
            }
        }

        companyDetailsViewModel.Company = company;
        companyDetailsViewModel.BillingAddress = billingAddress;
        companyDetailsViewModel.ServiceAddress = serviceAddress;
        return View(companyDetailsViewModel);
    }

    [HttpPost]
    public IActionResult Edit(CompanyDetailsViewModel companyDetailsViewModel)
    {
        var xx = _context.CompanyModel.Include(x => x.Addresses).ThenInclude(x => x.AddressType).Where(x => x.Id == companyDetailsViewModel.Company.Id).FirstOrDefault();
        foreach (var address in xx.Addresses)
        {
            switch (address.AddressType.AddressType.ToLower())
            {
                case "service":
                    address.street1 = companyDetailsViewModel.ServiceAddress.street1;
                    break;
                case "billing":
                    address.street1 = companyDetailsViewModel.BillingAddress.street1;
                    break;
            }
        }
        _context.SaveChanges();
        return View();
    }
}

Вот результат:

enter image description here

0 голосов
/ 20 апреля 2020

Измените AddressType на Enum и сохраните его в адресной модели

public int Id {get; set;}
public int CompanyId {get; set;}
public string street1 {get; set;} 
public AddressType AddressType {get; set;}
public virtual Company Company {get; set;}

public enum AddressType
    {
        Billing = 1,
        Service = 2
    }

создать для каждого l oop адрес и отредактировать их

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...