【问题标题】:Problem receiving form data in the controller. C# - MVC在控制器中接收表单数据时出现问题。 C# - MVC
【发布时间】:2021-04-13 11:26:34
【问题描述】:

朋友们,我有 3 张桌子。人、学生和地址。人是一个通用表,有姓名、电子邮件、电话等字段。我有一个地址表来保存学生的地址。我无法动态地从地址字段中获取信息并完成新的学生注册。如果有人可以分析,我将不胜感激。

这是我的代码: 我创建了一个 AddressViewModel 类来加入人员和地址字段。 地址视图模型.cs

public class AddressViewModel
    {

        public string PES_NAME { get; set; }
        public string PHONE { get; set; }
        public string PES_EMAIL { get; set; }
.
.
        //Address
        public string STREET { get; set; }
        public string CITY { get; set; }
        public string STATE{ get; set; }
.
.
    }

AddressContext.cs

public class AddressContext : DbContext
    {
        /*
         * EF Core - ORM
         * ORM -> Bibliteca mapear Objetos para Banco de Dados Relacionais
         */
        public AddressContext(DbContextOptions<AddressContext> options) : base(options)
        {
            
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Person>()
                .HasOne<Address>(s => s.Address)
                .WithOne(ad => ad.Person)
                .HasForeignKey<Address>(ad => ad.PES_COD);

            modelBuilder.Entity<Person>()
                .HasOne<Aluno>(s => s.Student)
                .WithOne(ad => ad.Person)
                .HasForeignKey<Student>(ad => ad.PersonID);

        }
        public DbSet<Person> Person { get; set; }
        public DbSet<Student> Student { get; set; }
        public DbSet<Address> Address { get; set; }
    }
}

这里我不知道该怎么做才能以正确的方式带入表单数据:

PersonRepository.cs

 public void create(Person person)
        {
            _banco.Add(person);
            
            Student student = new Student();
            student.Status = "A";
            student.DataCadastro = "10/10/2020";
            student.noFormularioRenach = "1010101";
            student.CodSetor = 10;
            student.PersonID = person.PES_COD;

            _banco.Student.Add(student);

            Address address = new Address();
            address.STREET = ????????;
            address.CITY = ????????;

            _banco.Address.Add(address);

            _banco.SaveChanges();
        }

学生的情况,因为我直接在代码中通知,所以信息被插入银行,但是学生的地址我不知道如何从表格中带上!

我像这样自动生成了我的表单:

@model LojaVirtual.Models.ViewModels.Student.AddressViewModel

@{
    ViewData["Title"] = "Add";
}

<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Add">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="PES_NAME" class="control-label"></label>
                <input asp-for="PES_NAME" class="form-control" />
                <span asp-validation-for="PES_NAME" class="text-danger"></span>
            </div>
.
.
.
          
            <div class="form-group">
                <label asp-for=PHONE" class="control-label"></label>
                <input asp-for="PHONE" class="form-control" />
                <span asp-validation-for="PHONE" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="PES_EMAIL" class="control-label"></label>
                <input asp-for="PES_EMAIL" class="form-control" />
                <span asp-validation-for="PES_EMAIL" class="text-danger"></span>
            </div>


.
.
            <div class="form-group">
                <label asp-for="CITY" class="control-label"></label>
                <input asp-for="CITY" class="form-control" />
                <span asp-validation-for="CITY" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="STATE" class="control-label"></label>
                <input asp-for="STATE" class="form-control" />
                <span asp-validation-for="STATE" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="STREET" class="control-label"></label>
                <input asp-for="STREE" class="form-control" />
                <span asp-validation-for="STREE" class="text-danger"></span>

.
.
.
.
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>


PersonController.cs

public IActionResult Add([FromForm]Models.Person person, string returnUrl = null)
        {
            if (ModelState.IsValid)
            {
                _clienteRepository.Add(person);
                _loginCliente.Login(person);

                TempData["MSG_S"] = "Success";

                if (returnUrl == null)
                {
                    return RedirectToAction("Index", "Home", new { area = "" });
                }
                else
                {
                    return LocalRedirectPermanent(returnUrl);
                }
            }
            return View();
        }

如果有人可以提供帮助,我将不胜感激!

【问题讨论】:

    标签: c# asp.net entity-framework-core asp.net-core-mvc


    【解决方案1】:

    您可以分别接收这两个参数(Person 和 Address),然后将地址添加到 person。

    public IActionResult Add([FromForm] Person person, [FromForm] Address address)
    {
        person.Address = address;
    
        //...
    
        return View();
    }
    

    【讨论】:

      【解决方案2】:

      Person 具有映射到 Address 和 Student 实体的导航属性。当您查询数据库时,通过使用 Linq 来利用 Address/Student 实体与 Person 实体之间的关系。

      Person.cs 应该如下所示:

      public Address Address {get;set;}
      public Student Student {get;set;}
      

      填充人实体:

      public void Add(Person person)
      {
           //instead initialize person.Student if the form doesn't pass this object
            person.Student = new Student();
              student.Status = "A";
              student.DataCadastro = "10/10/2020";
              student.noFormularioRenach = "1010101";
              student.CodSetor = 10;
              student.PersonID = person.PES_COD;
              //same thing with address
              person.Address = new Address();
              address.STREET = "123 street dr";
              address.CITY = "toronto";
      
              _context.SaveChanges();
      }
      

      然后,当检索人员对象并且您也需要填充外部实体时,应该如下所示:

      using System.Linq;
      
      _context.Person
      .Include(x => x.Student)
      .Include(x => x.Address)
      .Where(x => x.Id == PersonId)
      .FirstOrDefault();
      

      Form,应该是一个与你的 Person DTO 几乎相同的视图模型:

      @model Person
      
      
      <input asp-for="Address.Street" type="text"/>
      <input asp-for"Student.Name" type="text" />
      

      这会在

      中填充外键属性

      【讨论】:

      • 感谢您的反馈。地址部分需要来自表单!它由用户通知。代码中的报告有效,但我需要它来自表单。这是我的问题!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多