c# - Json 响应空值

标签 c# .net .net-5

我有一个 Controller 操作(我在某处找到了基础,现在找不到原始的),它提供文件上传并使用包含上传文件的 URL 的 JSON 负载进行响应,其中我已经构建了与 CKEditor 一起使用的功能。

如果我放置一个断点来查看响应值成功,我可以看到正确的 JSON 对象,正如我所期望的那样。

但是,浏览器中的响应返回一个空列表。

Controller 操作

[HttpPost]
public async Task<ActionResult> Upload(IFormFile upload, string CKEditorFuncNum, string CKEditor, string langCode)
{
    var user = await _userManager.GetUserAsync(User);
    var admin = _context.LeagueAdmins.Include(i => i.League).FirstOrDefault(i => i.User.Id == user.Id);
    if (user == null)
    {
        throw new ApplicationException($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
    }

    if (upload.Length <= 0) return null;

    if (!upload.IsImage())
    {
        var NotImageMessage = "You must upload a picture";
        dynamic NotImage = JsonConvert.DeserializeObject("{ 'uploaded': 0, 'error': { 'message': \"" + NotImageMessage + "\"}}");
        return Json(NotImage);
    }

    var fileName = Guid.NewGuid() + Path.GetExtension(upload.FileName).ToLower();

    Image image = Image.FromStream(upload.OpenReadStream());
    int width = image.Width;
    int height = image.Height;
    if ((width > 2000) || (height > 2000))
    {
       var DimensionErrorMessage = "Your image is too big. It must be a maximum of 2000px height and width";
       dynamic stuff = JsonConvert.DeserializeObject("{ 'uploaded': 0, 'error': { 'message': \"" + DimensionErrorMessage + "\"}}");
       return Json(stuff);
    }

    if (upload.Length > 500 * 1024)
    {
       var LengthErrorMessage = "The file is too big. Maximum file size is 5mb";
       dynamic stuff = JsonConvert.DeserializeObject("{ 'uploaded': 0, 'error': { 'message': \"" + LengthErrorMessage + "\"}}");
       return Json(stuff);
    }
    var directory = Path.Combine(_env.WebRootPath, "uploads", admin.League.Id.ToString(), "pages");
    var path = Path.Combine(directory, fileName);

    if (!Directory.Exists(directory))
    {
         var mkdir = Directory.CreateDirectory(directory);
    }

    try
    {
        using (var stream = new FileStream(path, FileMode.Create))
        {
             await upload.CopyToAsync(stream);
        }
    }
    catch (Exception ex)
    {
        var exception = ex.Message;
    }
           
    var url = $"{"/uploads/" + admin.League.Id.ToString() + "/pages/"}{fileName}";
    var successMessage = "File is uploaded successfully";
    var success = JsonConvert.DeserializeObject("{ 'uploaded': 1,'fileName': \"" + fileName + "\",'url': \"" + url + "\", 'error': { 'message': \"" + successMessage + "\"}}");
    return Json(success);
}

断点处对象的值

enter image description here

浏览器中的响应

enter image description here

最佳答案

从标准 C# 实践的角度来看,这是非常非常规的方法:

var success = JsonConvert.DeserializeObject("{ 'uploaded': 1,'fileName': \"" + fileName + "\",'url': \"" + url + "\", 'error': { 'message': \"" + successMessage + "\"}}");

只需创建一个类并实例化,填充数据并返回即可。如果您不想创建特殊类,请使用 anonymous type特点:

var success = new
{
    uploaded = 1,
    fileName = fileName,
    url = url,
    error = new
    {
        message = successMessage
    }
};

return Json(success); // or Ok(success)

附注

还有string interpolation这里看起来也很奇怪:

var url = $"{"/uploads/" + admin.League.Id.ToString() + "/pages/"}{fileName}";

不应该只是:

var url = $"/uploads/{admin.League.Id}/pages/{fileName}";

关于c# - Json 响应空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73050545/

相关文章:

c# - 无法让控制台日志记录在 .net core 2.0 中工作

c# - .NET显示不同的数据库变量但保存为ID?

c# - NUnit - 用于测试事务的单元测试用例

方法的 C# 字符串表示

c# - 无法在 Visual Studio 2019 中将 LocBaml 与 WPF .Net 5.0 项目一起使用

c# - CreateLogger() 之前被调用过,只能调用一次

C# 连接到 Ravendb 一直失败并出现错误 : This server requires client certificate for authentication, 但客户端未提供任何错误

c# - 测试 MVC Controller 操作 HttpAcceptAttribute 动词

c# - 使用通过私有(private)构造函数返回新实例的静态方法有优势吗?

.net - 哪个更快 : Working from memory or lots of queries?