【问题标题】:Return API result to view返回 API 结果以查看
【发布时间】:2020-12-21 15:04:01
【问题描述】:

我正在调用一个返回 JSON 字符串的 API,如下所示

{"ItemNumber":"5542","MD5Key":"md5key"}

我想做的是在我的视图中显示这些值,这就是我目前所拥有的。错误是我的代码返回了一个不存在的视图,并且我的 Model MD5 字符串为空,只是我直接填写的值是可以的(ItemNumber,File)。

型号

public class FileUpload
{
    [Required(ErrorMessage = "Item Number is required")]
    public int ItemNumber { get; set; }
    public byte[] File { get; set; }
    public string MD5Key { get; set; }
}

控制器:

[HttpPost]
public async Task<IActionResult> Upsert([FromForm] FileUpload obj)
{
    if (ModelState.IsValid)
    {
        var files = HttpContext.Request.Form.Files;
        if (files.Count > 0)
        {
            byte[] p1 = null;
            using (var fs1 = files[0].OpenReadStream())
            {
                using (var ms1 = new MemoryStream())
                {
                    fs1.CopyTo(ms1);
                    p1 = ms1.ToArray();
                }
            }
            obj.File = p1;
            obj.ItemNumber = 5542;
        }
    }

    await _cuRepo.CreateAsync("https://apiurl/method", obj.File, obj.ItemNumber);
    return View(obj);
    //This is returning a view Upsert, and obj.File, obj.ItemNumber are ok, just MD5 is null.
}

Repository(主要问题应该是这个)

public async Task<bool> CreateAsync(string url, byte[] file, int number)
{
    using (var client = new HttpClient())
    {
       client.DefaultRequestHeaders.Add("header", "aaaaaa");

        using (var content =
             new MultipartFormDataContent("Upload----" + DateTime.Now.ToString(CultureInfo.InvariantCulture)))
        {
            content.Add(new StringContent(number.ToString()), "ItemNumber");
            content.Add(new StreamContent(new MemoryStream(file)), "File", "filename.txt");

            using (var message = await client.PostAsync(url, content))
            {
                var input = await message.Content.ReadAsStringAsync();
                //input has the JSON string

                if (input != null)
                    return true;
                else
                    return false;
            }
        }
    }
}

发布后我可以做些什么来返回我的视图并使用 API 调用结果填充我的模型?

【问题讨论】:

  • 所以 'apiurl/method' 返回这个 {"ItemNumber":"5542","MD5Key":"md5key"} 因此 md5 有价值返回给你?所以你想得到那个 md5 值并从这个终点返回?或者您想在代码中计算 md5 值。
  • @GonzalesGokhan apiurl/method 正在返回该 JSON,之后我想做的是将这些值设置为我的模型并将该模型返回到我的视图以在表单控件中显示结果跨度>

标签: c# asp.net-mvc asp.net-core razor


【解决方案1】:

我将从 API 中为响应对象创建一个新类。将用户输入返回到页面不是一个好主意。最好有自己的视图模型。 (我使用 Json.NET nuget 包进行反序列化。

public class FileUploadResponse
{
    public int ItemNumber { get; set; }
    public string MD5Key { get; set; }
}

然后将响应 json 反序列化为 FileUploadResponse 对象

FileUploadResponse fileUploadResponse = JsonConvert.DeserializeObject<FileUploadResponse>(input); 

并返回它而不是 bool

return fileUploadResponse

您也必须更改方法签名

public async Task<FileUploadResponse> CreateAsync(string url, byte[] file, int number)

然后最后在你的 controller 中。你可以

var response=await _cuRepo.CreateAsync("https://apiurl/method", obj.File, obj.ItemNumber);
return View(response);

【讨论】:

  • 这现在将值返回到视图但是,返回视图(响应)正在返回不存在的视图 Upsert
  • 我修复了添加 return View("Index", response) 的问题,现在它可以工作了,但是它将 /Upsert 添加到我的网址中,有没有办法避免这种情况?只保留 mypage.com/FileUpload 而不是 mypage.com/FileUpload/Upsert
  • 你不能用 [HttpPost("/FileUpload")] 覆盖路由吗?我认为您的默认配置是 {ControllerName}/{MethodName} 。你可以阅读属性路由exceptionnotfound.net/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2016-02-08
相关资源
最近更新 更多