Все значения равны нулю при отправке на контроллер в ASP. NET Core - PullRequest
1 голос
/ 15 февраля 2020

Когда я вставляю значения в модель представления и отлаживаю, все значения в контроллере равны нулю, у меня есть [HttpGet] public IActionResult CreatePrescription(int id), который получает модель представления, а затем у меня есть

[HttpPost]
public IActionResult CreatePrescription(ViewModel model){
        try
        {
            Prescription prescription = new Prescription
            {
                PatientId = model.Patient.Id,
                MedicationId = model.Prescription.MedicationId,
                RxNumber = model.Prescription.RxNumber,
                Frequency = model.Prescription.Frequency,
                Quantity = model.Prescription.Quantity,
                Copay = model.Prescription.Copay,
                RefillsRemaining = model.Prescription.RefillsRemaining,
                FolderStatusId = model.Prescription.FolderStatusId,
                PrescriberId = model.Prescription.PrescriberId,
                OriginalRxDate = model.Prescription.OriginalRxDate,
                DateFilled = model.Prescription.DateFilled,
                ExpiryDate = model.Prescription.ExpiryDate,
                DeliveryDate = model.Prescription.DeliveryDate,
                DeliveryTime = model.Prescription.DeliveryTime,
                BillDate = model.Prescription.BillDate,
                ApplicationUserId = user,
                CreatedOn = DateTime.Now,
                IsActive = true
            };

            _context.Add(prescription);

            _context.SaveChanges();

        }
        catch (Exception)
        {

            throw;
        }
        return View();
    }

Вот часть вида

@model Systemz.Models.ViewModels.ViewModel
<div class="modal-body">
    <form asp-action="CreatePrescription" asp-controller="Patients" method="post">
        <input asp-for="Prescription.Id" type="hidden" />
        <input asp-for="Patient.Id" type="hidden" />
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <div class="row">
                <div class="col-sm-3">
                    <label asp-for="Prescription.RxNumber" class="custom-label"></label>
                </div>
                <div class="col-sm-7">
                    <input asp-for="Prescription.RxNumber" class="form-control" />
                </div>
                <span asp-validation-for="Prescription.RxNumber" class="text-danger"></span>
            </div>
        </div>
<div class="form-group">
            <div class="row">
                <div class="col-sm-3">
                    <label asp-for="Prescription.Frequency" class="custom-label"></label>
                </div>
                <div class="col-sm-7">
                    <input asp-for="Prescription.Frequency" class="form-control" />
                </div>
                <span asp-validation-for="Prescription.Frequency" class="text-danger"></span>
            </div>
        </div>

        <div class="form-group">
            <div class="row">
                <div class="col-sm-3">
                    <label asp-for="Prescription.Quantity" class="custom-label"></label>
                </div>
                <div class="col-sm-7">
                    <input asp-for="Prescription.Quantity" class="form-control" />
                </div>
                <span asp-validation-for="Prescription.Quantity" class="text-danger"></span>
            </div>
        </div>

А вот и класс

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Systemz.Models,ViewModels
{
    public class ViewModel
    {
        public Prescription Prescription {get;set;}
        public IEnumerable<Prescription> Prescriptions {get;set;}
    }
}

Вот мой контекст БД

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Systemz.Models;

namespace Systemz.Data
{
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
        {
        }

        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> 
    options)
        : base(options)
    {
    }

    public DbSet<Patient> Patients { get; set; }
    public DbSet<Address> Addresses { get; set; }
    public DbSet<PhoneNumber> PhoneNumbers { get; set; }
    public DbSet<Prescriber> Prescribers { get; set; }
    public DbSet<Prescription> Prescriptions { get; set; }
    protected override void OnModelCreating(ModelBuilder builder)
    {
         builder.Entity<PatientPrescriber>()
             .HasKey(bc => new { bc.PatientId, bc. PrescriberID });
         builder.Entity<PatientPrescriber>()
             .HasOne(bc => bc.Patient)
            .WithMany(b => b.PatientPrescribers)
            .HasForeignKey(bc => bc.PatientId);
        builder.Entity<PatientPrescriber>()
            .HasOne(bc => bc.Prescriber)
            .WithMany(c => c.PatientPrescribers)
            .HasForeignKey(bc => bc.PrescriberId);
        base.OnModelCreating(builder);
    }
}

Все значения в IEnumerable<Prescription> Prescriptions {get;set;} находятся в классе с именем Prescription. Вот отладка, которая показывает, что PatientId принят, но все остальные свойства имеют значение null PAtientId и Null Properties , почему мои значения не передаются в контроллер а не сохранение в базе?

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Вот три наблюдения, которые я сделал, просматривая части вашего кода

  • В вашем Post методе CreatePrescription рекомендуется проверять ModelState.IsValid
     [HttpPost]
     public IActionResult CreatePrescription(ViewModel model){
     if(ModelState.IsValid)
     {
       try
       { Prescription prescription = new Prescription{ ....   } }
     }
    
  • В вашем Get методе CreatePrescription убедитесь, что вы возвращаете model в View.

    
     [HttpGet]
     public IActionResult CreatePrescription(int id)
     {
       //Any other business logic
        var model = new ViewModel();
        return View(model)
     }
    
  • Пространство имен вашего ViewModel класса определяется как Systemz.Models,ViewModels с запятой, а в вашем представлении вы называете его Systemz.Models.ViewModels.ViewModel.
0 голосов
/ 03 марта 2020

Оказывается, причина того, что он не работал, заключается в том, что View допускает только один form в нем. Я не знал, что он будет читать только первые form на мой взгляд, поэтому проблема решена. У меня было <form asp-action="CreatePrescriber" asp-controller="Patients" method="Post"> и <form asp-action="CreatePrescription" asp-controller="Patients" method="Post">. Это займет один <form /> и перестанет читать после этого.

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