Возвращает результат API для просмотра

#c# #asp.net-mvc #asp.net-core #razor

#c# #asp.net-mvc #asp.net-ядро #razor

Вопрос:

Я вызываю API, который возвращает строку JSON, как показано ниже

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

Что я хочу сделать, так это показать эти значения в моем представлении, и это то, что у меня есть на данный момент. Ошибка заключается в том, что мой код возвращает представление, которое не существует, а моя строка 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.
}
 

Репозиторий (основная проблема должна заключаться в этом)

 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?

Комментарии:

1. итак, ‘ apiurl / method ‘ возвращает это {«ItemNumber»:»5542″,»MD5Key»:»md5key»}, поэтому значение md5 возвращается к вам? итак, вы хотите получить это значение md5 и вернуться из этого конечного значения? или вы хотите вычислить значение md5 в своем коде.

2. @GonzalesGokhan apiurl/метод возвращает этот JSON, после чего я хочу установить эти значения для моей модели и вернуть эту модель в мое представление, чтобы показать результат в элементах управления формы

Ответ №1:

я бы создал новый класс для объекта ответа из API. Не стоит возвращать пользовательский ввод на страницу. Лучше иметь свою собственную модель представления. (я использую Json.ЧИСТЫЙ пакет 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)
 

затем, наконец, в вашем контроллере. вы можете

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

Комментарии:

1. Теперь это возвращает значения в представление, однако возвращаемое представление (ответ) возвращается к обновлению представления, которого не существует

2. Я исправил добавление return View («Индекс», ответ), и теперь он работает, однако он добавляет / Upsert к моему URL, есть ли способ избежать этого? Просто сохраняя mypage.com/FileUpload вместо того , чтобы mypage.com/FileUpload/Upsert

3. вы не можете переопределить маршрут с помощью [HttpPost(«/ FileUpload»)] ? я думаю, что ваша конфигурация по умолчанию — {controllerName}/{methodName} . вы можете прочитать о маршрутизации атрибутов exceptionnotfound.net /…