#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 /…