AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-5201985

Enrico's questions

Martin Hope
Enrico
Asked: 2025-04-15 01:48:01 +0800 CST

Serviço de cliente de API C# genérico com retornos comuns

  • 6

Tenho um projeto em C# que chama algumas APIs. Essas APIs são bem diferentes, e a resposta é diferente para quase todas as chamadas.

Eu escrevi um serviço de cliente genérico:

public class HttpClientHelper
{
    private readonly IHttpClientFactory _httpClientFactory;

    public HttpClientHelper(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    public async Task<TResponse> MakeHttpRequestAsync<TRequest, TResponse>(
        string clientName,
        string url,
        HttpMethod httpMethod,
        TRequest requestBody = default,
        bool handleErrors = false)
    {
        // Get a named HttpClient instance
        var client = _httpClientFactory.CreateClient(clientName);

        var request = new HttpRequestMessage
        {
            Method = httpMethod,
            RequestUri = new Uri(url)
        };

        // Serialize the request body to JSON (if it exists)
        if (requestBody != null)
        {
            var json = JsonSerializer.Serialize(requestBody);
            request.Content = new StringContent(json, 
                                  Encoding.UTF8, "application/json");
        }

        // Send the HTTP request
        var response = await client.SendAsync(request);

        // Handle errors if specified
        if (handleErrors && !response.IsSuccessStatusCode)
        {
            throw new HttpRequestException($"Failed: {response.StatusCode}");
        }

        // Deserialize the response JSON into the specified type
        var responseJson = await response.Content.ReadAsStringAsync();
        return JsonSerializer.Deserialize<TResponse>(responseJson, 
            new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
    }
}

Agora, quero ter um retorno mais estruturado desta função. Por exemplo, gosto de usar para todas as respostas algo como

public class ApiResponse<T> where T : class
{
    public T? Data { get; set; }
    public string? ErrorMessage { get; set; }
    public int HttpErrorCode { get; set; } = 200;
    public bool Success { get; set; } = false;
}

Não preciso lidar com os erros no código principal, e tudo é gerenciado perfeitamente no cliente da API genérica. Se houver um erro na chamada, no ApiResponse, posso definir Successcomo false.

Se eu escrever este código:

public async Task<ApiResponse<TResponse>> 
    MakeHttpRequestAsync<TRequest, ApiResponse<TResponse>>(
    ...
    )
{
    // code
}

Recebo um erro

O tipo ou nome do namespace TResponsenão pôde ser encontrado (está faltando uma diretiva using ou uma referência de assembly?)

O que não quero é derivar uma classe do ApiResponseporque uso os modelos em outras partes do código.

Existe uma maneira de implementar isso?

c#
  • 1 respostas
  • 61 Views
Martin Hope
Enrico
Asked: 2025-02-18 21:44:41 +0800 CST

Outra instância de uma entidade gera um erro ao atualizar

  • 5

Na minha API Web do ASP.NET Core 9 e no Entity Framework Core, tenho uma classe de modelo para a Clientque tem um relacionamento muitos para muitos com a classe de modelo Channel.

public class Client
{
    [Key]
    public long ID { get; set; }
}

public class Channel
{
    [Key]
    public long ID { get; set; }
    public string? Name { get; set; }
    public ICollection<Client>? Client { get; set; }
}

Após a migração, o banco de dados tem a estrutura de uma nova tabela como eu esperava:

insira a descrição da imagem aqui

Posso adicionar novos valores usando o Entity Framework Core.

O problema começa quando quero atualizar os valores.

Tenho uma API, com um PUTverbo para ser preciso, que recebe o Clientobjeto como parâmetro com todos os detalhes. Primeiro leio o objeto do banco de dados, incluindo o Channels:

var localClient = await db.Client.AsNoTracking()
                          .Include(c => c.Channels)
                          .FirstOrDefaultAsync(model => model.ID == id);

Então, mapeio o parâmetro com os dados do banco de dados:

localClient = mapper.Map<Domain.Client>(client);

E então eu atualizo Channelsusando os valores do parâmetro:

localClient.Channels?.Clear();

if (client.Channels != null)
{
    var listChannels = client.Channels.ToList();

    foreach (Channel ch in listChannels)
    {
        var l = await db.Channels.Where(c => c.ID == ch.ID).FirstOrDefaultAsync();

        if (l != null)
            if (localClient.Channels!.Count(c => c.ID == l.ID) == 0)
                localClient.Channels?.Add(l);
    }
}

Se eu inspecionar o localClientobjeto, há apenas canais exclusivos e nenhuma duplicação. Quando eu quero salvar usando

db.Attach(client);

Recebo imediatamente este erro:

A instância do tipo de entidade 'Channel' não pode ser rastreada porque outra instância com o mesmo valor de chave para {'ID'} já está sendo rastreada. Ao anexar entidades existentes, garanta que apenas uma instância de entidade com um determinado valor de chave seja anexada. Considere usar 'DbContextOptionsBuilder.EnableSensitiveDataLogging' para ver os valores de chave conflitantes.

Não consigo entender por que recebo esse erro. Verifiquei meus projetos antigos e uso um processo semelhante.

Atualizar

clienté um objeto que passo via API: ele contém todos os detalhes sobre o cliente, também a lista de canais.

group.MapPut("/{id}",
        async Task<Results<Ok, NotFound>> (long id, Domain.Client client, 
        MyDbContext db, IMapper mapper) =>
        {
            // code above
        }

Busquei clientno banco de dados porque pensei que o erro estava relacionado a uma nova instância ou registro em vez de atualizar um existente.

Atualização/2

Criei no GitHub um pequeno projeto para testar a atualização. Apliquei as sugestões abaixo, mas o objeto não é atualizado no banco de dados.

c#
  • 1 respostas
  • 80 Views
Martin Hope
Enrico
Asked: 2025-02-08 21:49:48 +0800 CST

MainLayout e modo de renderização da barra lateral no Blazor

  • 5

Meu aplicativo é construído com .NET 8 no Blazor. A configuração no Program.csé assim:

builder.Services.AddRazorComponents()
    .AddInteractiveServerComponents()
    .AddInteractiveWebAssemblyComponents();

Quero ter uma barra lateral legal para isso. Criei um SidebarComponentque gera a barra lateral muito bem. Este é o código do componente

@inject NavigationManager _navigationManager
@rendermode InteractiveAuto

<aside id="sidebar" class="sidebar break-point-sm has-bg-image @(_isCollapsed ? "collapsed" : "") @(_isToggled ? "toggled" : "")">
    <a @onclick="BtnCollapseClicked" id="btn-collapse" class="sidebar-collapser"><i class="ri-arrow-left-s-line"></i></a>
    <div class="image-wrapper">
    </div>
    <div class="sidebar-layout">
        <div class="sidebar-header">
            <div class="pro-sidebar-logo">
                <div>P</div>
                <h5>Pro Sidebar</h5>
            </div>
        </div>
        <div class="sidebar-content">
            <nav class="menu open-current-submenu">
                <ul>
                    <li class="menu-header"><span>BLAZOR</span></li>

                    @foreach (var menuItem in standardItems)
                    {
                        <MenuItemComponent MenuItem="@menuItem" MenuItemClickCallback="MenuItemClick" />
                    }
                </ul>
            </nav>
        </div>
    </div>
</aside>

@code {
    private bool _isCollapsed { get; set; } = false;
    private bool _isToggled { get; set; } = false;

    List<MenuItem> standardItems = SidebarData.GetStandardMenuItems();
    List<MenuItem> generalMenuItems = SidebarData.GetGeneralMenuItems();

    public void BtnToggleClicked()
    {
        _isToggled = !_isToggled;
        StateHasChanged();
    }

    public void MouseClickedInOverlay()
    {
        if (_isToggled)
            _isToggled = false;
        generalMenuItems.ForEach(x => x.IsOpened = false);
        StateHasChanged();
    }

   // Omitted
}

Então no MainLayout, eu adicionei

<div class="layout has-sidebar fixed-sidebar fixed-header">
    <SidebarComponent @ref="sideBarComponent"/>

    <div @onclick="@(e => sideBarComponent?.MouseClickedInOverlay())" id="overlay" class="overlay"></div>
    <div class="layout">
    <!-- Omitted -->
    </div>
</div>

Quando o aplicativo inicia, recebo este erro:

System.InvalidCastException: 'Não é possível converter o objeto do tipo 'Microsoft.AspNetCore.Components.Endpoints.SSRRenderModeBoundary' para o tipo 'HypnoPlatform.Client.Pages.Shared.Sidebar.SidebarComponent'.'

insira a descrição da imagem aqui

Como posso chamar métodos de MainLayoutpara SidebarComponent?

c#
  • 1 respostas
  • 35 Views
Martin Hope
Enrico
Asked: 2024-12-15 18:02:39 +0800 CST

Converter um valor para int de string em @bind-Value no Blazor

  • 5

Na minha página Blazor, tenho este código simples (ToggleButtonGroup é daqui ) .

<div class="col-lg-6">
    <label class="form-label form-field-label">Insert your value</label>
    <ToggleButtonGroup Options="@GroupOptions.Options0To10" 
        @bind-Value="@_session.InteractiveNumber" />
    <hr>
</div>

O modelo que eu uso é definido assim

public class Session {
    public int ActiveNumber { get; set; }
}

public Session _session = new();

O ToggleButtonGroup retorna uma string como um valor, mas eu quero armazenar no banco de dados e é por isso que o Sessioné definido dessa forma. Como posso converter o valor de a stringpara int? Posso usar algo como @(e => _session.ActiveNumber = e.ToString())?

c#
  • 1 respostas
  • 28 Views
Martin Hope
Enrico
Asked: 2024-12-12 08:10:21 +0800 CST

Grupo de botões de opção Bootstrap

  • 5

Estou criando um formulário no Blazor e gostaria de ter um segmento como o exemplo a seguir

insira a descrição da imagem aqui

Usando Bootstrap , tenho esse código para isso

<div class="btn-group" role="group" aria-label="Basic radio toggle button group">
    <input type="radio" id="btnradio1-@Id" class="btn-check" name="btnradio1-@Id" 
        autocomplete="off" checked @bind-value="Value">
    <label class="form-label btn btn-outline-primary" for="btnradio1-@Id">
        Yes</label>

    <input type="radio" id="btnradio2-@Id" class="btn-check" name="btnradio2-@Id" 
        autocomplete="off" @bind-value="Value">
    <label class="form-label btn btn-outline-primary" for="btnradio2-@Id">
        No</label>

    <input type="radio" id="btnradio3-@Id" class="btn-check" name="btnradio3-@Id" 
        autocomplete="off" @bind-value="Value">
    <label class="form-label btn btn-outline-primary" for="btnradio3-@Id">
        Sometimes</label>
</div>

e no código, tenho este parâmetro :

[Parameter] public string Id { get; set; } = Guid.NewGuid().ToString();
[Parameter] public string? Value { get; set; }

Quando clico em uma entrada , quero alterar o Valor com o valor correspondente da entrada em que cliquei. Por exemplo, se eu clicar em Não , quero que o Valor seja Não .

c#
  • 1 respostas
  • 32 Views
Martin Hope
Enrico
Asked: 2024-12-02 15:20:22 +0800 CST

A identidade não cria as tabelas no banco de dados

  • 5

Estou iniciando um novo projeto .NET 9 Blazor. Quando criei o projeto, escolhi usar a opção "Individual Account". Então, o procedimento do Visual Studio adicionou o Identityao projeto. Não altero nada, o projeto está como está pronto para uso.

insira a descrição da imagem aqui

Quando executo o projeto, quero registrar um novo usuário. Quando clico para registrar o usuário, sempre recebo o erro

Microsoft.Data.SqlClient.SqlException: Nome de objeto inválido 'AspNetUsers'

insira a descrição da imagem aqui

Este erro ocorre se eu usar um banco de dados SQL no Azure ou um banco de dados local. Eu alterei a string de conexão no appsettings.json. Em qualquer caso, as tabelas para Identity não são criadas.

c#
  • 1 respostas
  • 23 Views
Martin Hope
Enrico
Asked: 2024-08-05 17:16:44 +0800 CST

Insira o valor padrão na inserção de OPENJSON no SQL Server

  • 4

Estou criando um procedimento armazenado para adicionar em uma tabela os dados de um json. A tabela tem um IDdefinido como uniqueidentifiere um CreatedAtdefinido como datetime.

Se eu tentar executar este script sem IDand\or CreatedAt, recebo este erro

O nome da coluna ou o número de valores fornecidos não corresponde à definição da tabela.

Um exemplo do script é o seguinte:

INSERT INTO [RequestsDetails]
SELECT *
  FROM OPENJSON(@json)
  WITH (
    RequestId        uniqueidentifier '$.RequestId',       
    QuoteId          uniqueidentifier '$.QuoteId',         
    SiteId           int              '$.SiteId',          
    SumBuilding      money            '$.SumBuilding'
  )

Se eu adicionar a linha usando NEWID()for the IDe GETDATE()for the CreatedAt, recebo o erro

Sintaxe incorreta próximaNEWID

insira a descrição da imagem aqui

e este é um exemplo do script

INSERT INTO [RequestsDetails]
SELECT *
  FROM OPENJSON(@json)
  WITH (
    Id               uniqueidentifier NEWID(),
    RequestId        uniqueidentifier '$.RequestId',       
    QuoteId          uniqueidentifier '$.QuoteId',         
    SiteId           int              '$.SiteId',          
    SumBuilding      money            '$.SumBuilding',
    CreatedAt        datetime         GETDATE()
  )

Como posso adicionar esses valores que não estão presentes no json?

Atualizar

Se no procedimento armazenado eu tiver um parâmetro, como posso usá-lo no INSERT? Por exemplo

@RequestId uniqueidentifier

INSERT INTO [Sace].[RequestsDetails] (
    RequestId        
    -- omitted all the fields  
)
SELECT *
  FROM OPENJSON(@json)
  WITH (
    RequestId        uniqueidentifier @RequestId
    -- omitted all the fields
  )
sql
  • 1 respostas
  • 36 Views
Martin Hope
Enrico
Asked: 2024-03-08 17:35:46 +0800 CST

.NET MAUI: espaço em branco indesejado na parte inferior da tela no Android

  • 5

Eu vi este post sobre a mesma coisa, mas para iOS. Mais dispositivos Android têm na parte inferior da tela um controle de linha semelhante ao iOS.

insira a descrição da imagem aqui

Este é um exemplo do meu aplicativo criado com .NET8 MAUI. Como você pode ver, existe uma linha que, assim como no iOS, permite ao usuário deslizar o aplicativo para fora.

Seguindo a mesma lógica do outro post, recebo

public partial class DeviceSafeInsetsService
{
    public partial double GetSafeAreaTop();
    public partial double GetSafeAreaBottom();
}

Você sabe qual poderia ser a implementação para Android?

  • 1 respostas
  • 22 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve