c# – Form is not submitting any value using ASP.NET Core MVC to database


I’m developing a chat app. I have users, services, chat and service providers.

I’m currently unable to create a chat, so I need help. I leave code below and also some outputs that they give me.

The definition is to list all created services. In other words, when creating a chat I can choose a service that you create which will then be automatically assigned to a provider that has that serviceid

ChatController:

using Microsoft.AspNetCore.Mvc;
using HTE.Data;
using HTE.Models;
using System.Linq;
using System;
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc.Rendering;

namespace HTE.Controllers
{
    public class ChatController : Controller
    {
        private readonly HTEDbContext _context;
        private readonly ILogger<ChatController> _logger;  // Injetar o logger

        public ChatController(HTEDbContext context, ILogger<ChatController> logger)
        {
            _context = context;
            _logger = logger;
        }

        [HttpGet]
        public IActionResult CreateChat()
        {
            var model = new ChatViewModel
            {
                Servicos = _context.Servicos.ToList()  // Pega diretamente a lista de serviços
            };

            return View(model);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult CreateChat(ChatViewModel model)
        {
            if (!ModelState.IsValid)
            {
                foreach (var modelState in ModelState)
                {
                    foreach (var error in modelState.Value.Errors)
                    {
                        _logger.LogError($"Erro no campo {modelState.Key}: {error.ErrorMessage}");
                    }
                }

                model.Servicos = _context.Servicos.ToList();

                return View(model);
            }

            try
            {
                // Processar a criação do chat (lógica para gravar o chat na BD)
                var utilizadorID = int.Parse(User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value);

                var prestadores = _context.PrestadorDeServicos
                                          .Where(p => p.ServicoID == model.ServicoID)
                                          .ToList();

                if (!prestadores.Any())
                {
                    _logger.LogWarning("Nenhum prestador disponível para o serviço selecionado.");
                    model.Servicos = _context.Servicos.ToList();
                    return View(model);
                }

                var random = new Random();
                var prestadorAleatorio = prestadores[random.Next(prestadores.Count)];

                var chat = new Chat
                {
                    UtilizadorID = utilizadorID,
                    PrestadorDeServicosID = prestadorAleatorio.PrestadorDeServicosID,
                    NomeChat = model.NomeChat,
                    DataCriacao = DateTime.Now
                };

                _context.Chat.Add(chat);
                _context.SaveChanges();

                return RedirectToAction("Index", "Chat");
            }
            catch (Exception ex)
            {
                _logger.LogError($"Erro ao criar o chat: {ex.Message}");
                model.Servicos = _context.Servicos.ToList();
                return View(model);
            }
        }

        // GET: /Chat/Index
        [HttpGet]
        public IActionResult Index()
        {
            if (User.Identity.IsAuthenticated)  // Verifica se o utilizador está autenticado
            {
                var utilizadorIDClaim = User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier);

                if (utilizadorIDClaim != null)
                {
                    var utilizadorID = int.Parse(utilizadorIDClaim.Value);

                    var chats = _context.Chat
                        .Where(c => c.UtilizadorID == utilizadorID)
                        .ToList();

                    return View(chats);
                }
                else
                {
                    // Caso o claim não esteja presente
                    Console.WriteLine("Claim 'NameIdentifier' não encontrado.");
                    return RedirectToAction("Login", "Account");  // Redireciona para a página de login
                }
            }
            else
            {
                // Redireciona para a página de login caso não esteja autenticado
                return RedirectToAction("Login", "Account");
            }
        }
    }
}

Service model:

using System.ComponentModel.DataAnnotations.Schema;

namespace HTE.Models
{
    public class Servicos
    {
        public int ServicoID { get; set; }  // Esta será a chave primária
        public string NomeServico { get; set; }
    }
}

Chat model:

using Microsoft.AspNet.SignalR.Messaging;

namespace HTE.Models
{
    public class Chat
    {
        public int ChatID { get; set; }
        public string NomeChat { get; set; }
        public DateTime DataCriacao { get; set; }
        public List<Mensagem> Mensagens { get; set; }

        // Chaves estrangeiras
        public int UtilizadorID { get; set; }  // Chave estrangeira
        public Utilizador Utilizador { get; set; }  // Navegação para o Utilizador

        public int PrestadorDeServicosID { get; set; }  // Chave estrangeira
        public PrestadorDeServicos PrestadorDeServicos { get; set; }  // Navegação para o Prestador de Serviços
    }
}

CreateChat.cshtml:

@model HTE.Models.ChatViewModel

<form asp-action="CreateChat" method="post">
    <div class="form-group">
        <label asp-for="NomeChat"></label>
        <input asp-for="NomeChat" class="form-control" />
        <span asp-validation-for="NomeChat" class="text-danger"></span>
    </div>

    <div class="form-group">
        <label asp-for="ServicoID"></label>
        <select asp-for="ServicoID" class="form-control">
            <option value="">Selecione um serviço</option>
            @foreach (var servicos in Model.Servicos)
            {
                <option value="@servicos.ServicoID">@servicos.NomeServico</option>
            }
        </select>
        <span asp-validation-for="ServicoID" class="text-danger"></span>
    </div>

    <button type="submit" class="btn btn-primary">Criar Chat</button>
</form>

SQL Server tables:

CREATE TABLE [dbo].[Chat] 
(
    [ChatID]                INT IDENTITY (1, 1) NOT NULL,
    [UtilizadorID]          INT NOT NULL,
    [PrestadorDeServicosID] INT NOT NULL,
    [DataCriacao]           DATETIME DEFAULT (getdate()) NULL,
    [NomeChat]              NVARCHAR(255) NOT NULL,
    PRIMARY KEY CLUSTERED ([ChatID] ASC),
    FOREIGN KEY ([UtilizadorID]) 
        REFERENCES [dbo].[Utilizador] ([UtilizadorID]),
    FOREIGN KEY ([PrestadorDeServicosID]) 
        REFERENCES [dbo].[PrestadorDeServicos] ([PrestadorDeServicosID])
);

CREATE TABLE [dbo].[Servicos] 
(
    [ServicoID]   INT IDENTITY (1, 1) NOT NULL,
    [NomeServico] NVARCHAR(100) NOT NULL,
    PRIMARY KEY CLUSTERED ([ServicoID] ASC)
);

Output:

When I click on the button to create chat, it gives these values

fail: HTE.Controllers.ChatController\Erro no campo Servicos: The Servicos field is required. (https://i.sstatic.net/GJBy6PQE.png)

What are you supposed to do? When you click on the create chat button, the chat is created and saved in the database, thank you for helping me!

I used chatgpt to help solve the problem, but I still couldn’t

Leave a Reply

Your email address will not be published. Required fields are marked *