Форма не отправляет какое-либо значение с помощью ASP.NET Core MVC в базу данных.C#

Место общения программистов C#
Anonymous
Форма не отправляет какое-либо значение с помощью ASP.NET Core MVC в базу данных.

Сообщение Anonymous »

Я разрабатываю приложение для чата. У меня есть пользователи, службы, чат и поставщики услуг.
В настоящее время я не могу создать чат, поэтому мне нужна помощь. Ниже я оставляю код, а также некоторые результаты, которые они мне дают.
Определение состоит в том, чтобы перечислить все созданные сервисы. Другими словами, при создании чата я могу выбрать создаваемую вами услугу, которая затем будет автоматически назначена провайдеру, имеющему этот идентификатор службы

Код: Выделить всё

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 _logger;  // Injetar o logger

public ChatController(HTEDbContext context, ILogger 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");
}
}
}
}
Модель обслуживания:

Код: Выделить всё

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; }
}
}
Модель чата:

Код: Выделить всё

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 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









Selecione um serviço
@foreach (var servicos in Model.Servicos)
{
@servicos.NomeServico
}



Criar Chat

Таблицы SQL Server:

Код: Выделить всё

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)
);
Вывод:
Когда я нажимаю кнопку создания чата, он выдает следующие значения
ошибка: HTE.Controllers.ChatController\Erro no Campo Servicos: Поле Servicos является обязательным. (https://i.sstatic.net/GJBy6PQE.png)

Что вам делать? При нажатии на кнопку «Создать чат» чат создается и сохраняется в базе данных, спасибо за помощь!
Я использовал chatgpt, чтобы помочь решить проблему, но все равно не смог т

Подробнее здесь: https://stackoverflow.com/questions/790 ... o-database

Вернуться в «C#»