我有一个 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);
}
断点处对象的值
浏览器中的响应
最佳答案
从标准 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/