【问题标题】:Posting in blazor returns exception stating that "The JSON value could not be converted to System.Int32."在 blazor 中发布会返回异常,指出“无法将 JSON 值转换为 System.Int32”。
【发布时间】:2021-05-06 19:59:52
【问题描述】:

我是 Blazor 的新手,在尝试使用身份验证令牌发布数据时遇到以下问题:在 API 调用时,引发异常并显示消息“JSON值无法转换为 System.Int32。路径:$ | LineNumber: 0 | BytePositionInLine: 1."

这是我的 blazor 页面代码隐藏中的代码:

public partial class ContactCreate : AuthenticatedPageBase
{
    [Inject]
    public IContactDataService ContactDataService { get; set; }

    [Inject]
    public ICountryDataService CountryDataService { get; set; }

    public Contact.Post Model { get; set; } = new Contact.Post();

    protected string CountryIdString { get; set; } = string.Empty;

    protected string TokenString { get; set; } = string.Empty;

    public string ErrorMessage { get; set; } = string.Empty;

    protected List<Country.ListItem> Countries { get; set; } = new List<Country.ListItem>();

    protected async override Task OnInitializedAsync()
    {
        await base.OnInitializedAsync();
        Countries = (await CountryDataService.GetCountryListAsync(Token.Token)).ToList();
        TokenString = Token.Token;
    }

    protected async Task HandleValidSubmit()
    {
        try
        {
            Model.CountryId = int.Parse(CountryIdString);
            var response = await ContactDataService.PostContactAsync(TokenString, Model);
            NavManager.NavigateTo("/contacts");
        }
        catch(Exception ex)
        {
            ErrorMessage = ex.Message;
        }
    }

    protected void HandleInvalidSubmit()
    {
        ErrorMessage = "Le formulaire n'est pas valide. Veuillez réessayer.";
    }
}

这是数据服务中的相关代码:

public async Task<int> PostContactAsync(string token, Contact.Post model)
{
    var response = await PostAuthenticatedAsync<int>(token, Url, model);
    return response;
}

public async Task<T> PostAuthenticatedAsync<T>(string token, string url, object model)
{
    var jsonBody = model.ToJson();
    var request = new HttpRequestMessage()
    {
        RequestUri = new Uri(HttpClient.BaseAddress.ToString() + url),
        Method = HttpMethod.Post,
        Content = jsonBody
    };
    request.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
    var response = await HttpClient.SendAsync(request);
    return await response.FromJson<T>(Options);
}

...以及将对象序列化为 json 的扩展方法:

public static StringContent ToJson(this object o)
{
    return new StringContent(JsonSerializer.Serialize(o), Encoding.UTF8, "application/json");
}

这是我正在通过的对象模型:

public class Contact
{
    public class Post
    {
        [MaxLength(50)]
        public string FirstName { get; set; }
        [MaxLength(50)]
        public string LastName { get; set; }
        [MaxLength(50)]
        public string CompanyName { get; set; }
        public string AddressLine1 { get; set; }
        public string AddressLine2 { get; set; }
        [MaxLength(20)]
        public string PostCode { get; set; }
        [MaxLength(60)]
        public string Locality { get; set; }
        public int CountryId { get; set; }
    }
}

最后,这是我想要达到的 API 方法:

[HttpPost]
public async Task<ActionResult> PostContact(Contact.Post model)
{
    try
    {
        var createdId = await _contactRepository.CreateAsync(model);
        return Ok(new { Id = createdId });
    }
    catch (Exception ex)
    {
        return BadRequest(new { ex.Message });
    }
}

知道发生了什么或这个神秘的错误消息背后隐藏着什么实际异常吗?

附: :我知道确切的异常消息存在问题,但它与 .NET Core 相关,而我的目标是 .NET Standard 2.1。我读过,显然不适用于本案。

【问题讨论】:

  • response 是什么,具体来说返回的 JSON 是什么?究竟是哪里抛出了异常?

标签: c# json blazor .net-standard jwt-auth


【解决方案1】:

您没有返回一个 int(ID)。您将返回一个具有名为 Id 的 int 属性的匿名对象。 试试

return Ok(createdId);

【讨论】:

  • 确实是这样,我忘记修改那个return语句了。我没有注意它,因为我的 API 控制器方法上的断点由于某种原因没有到达。
猜你喜欢
  • 2019-12-28
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 2014-12-08
  • 2020-07-13
相关资源
最近更新 更多