Как вернуть представление вместе с моделью в асинхронной задаче в Asp.Net MVC - PullRequest
0 голосов
/ 31 декабря 2018

Я тестирую асинхронную задачу в MVC и создаю асинхронную задачу, следуя коду.Когда я возвращаю значение модели вместе с именем вида return View("Index", EmpResponse), я получаю сообщение об ошибке.но если я просто верну представление return view().он работает хорошо.

public class AsynchController : Controller
    {
        string Baseurl = "http://dummy.restapiexample.com/api/v1/";
        // GET: Asynch
        public async Task<ActionResult> Index()
        {
            using (var client = new HttpClient())
            {
                //Passing service base url  
                client.BaseAddress = new Uri(Baseurl);

                client.DefaultRequestHeaders.Clear();
                //Define request data format  
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                //Sending request to find web api REST service resource GetAllEmployees using HttpClient  
                HttpResponseMessage Res = await client.GetAsync("employees");
                var EmpResponse = "";
                //Checking the response is successful or not which is sent using HttpClient  
                if (Res.IsSuccessStatusCode)
                {
                    //Storing the response details recieved from web api   
                    EmpResponse = Res.Content.ReadAsStringAsync().Result;

                    //Deserializing the response recieved from web api and storing into the Employee list  
                }
                //returning the employee list to view  
                return View("Index", EmpResponse);
            }
        }

enter image description here

В простом ActionResult я знаю, что мы можем вернуть имя вида и модель одновременно.это проблема с асинхронной задачей?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Это не проблема асинхронности, а проблема типа модели.(Хотя является асинхронной проблемой, которая может стать проблемой ... Не вызывайте .Result напрямую, а вместо этого используйте await для получения результата.)

Ваша модельэто строкаНо перегрузка для View(), которая занимает вторую строку, использует ее для поиска именованного представления .Именно поэтому он ищет представление , называемое вашей длинной строкой JSON.(Ну, «главный вид» в данном случае , поскольку вы отправляете ему две строки.)

Не используйте строку в качестве модели.Используйте модель.Вместо того, чтобы посылать одну большую строку JSON на ваш взгляд, десериализуйте ее в какую-то модель.Тип зависит от вас, но десериализация может выглядеть примерно так:

var response = await client.GetAsync("employees");
YourModelTypeHere model = null;
if (response.IsSuccessStatusCode)
{
    var responseString = await result.Content.ReadAsStringAsync();
    model = JsonConvert.DeserializeObject<YourModelTypeHere>(responseString);
}
return View(model);

В result может быть даже опция для чтения / десериализации вашей модели напрямую, сохраняя вам строку кода выше,Но общий принцип тот же.Используйте строго типизированные модели вместо сложных сериализованных строк.

* В этом случае YourModelTypeHere выглядит так, как будто это будет IEnumerable<YourModel> или, возможно, IList<YourModel>, на основе сериализованного JSON, который мы используем.Наблюдение.

* Также обратите внимание, что при этом используется ваша текущая логика отправки пустой модели в то же представление, если ничего не было успешно получено.Для пустой строки, которая может быть в порядке, для null это может стать проблематичным, в зависимости от того, что делает ваш взгляд.(В любом случае ваше представление должно будет измениться, если оно в настоящее время ожидает строку в качестве модели.) Возможно, перенаправить или вернуть ошибку в случае отсутствия доступной модели?Логика поведения вашей системы зависит от вас.

0 голосов
/ 31 декабря 2018

Ваше намерение - передать EmpResponse в качестве модели представления для вашего Index представления, но, поскольку вы уже десериализовали EmpResponse как string, это соответствует неправильной перегрузке вспомогательного метода View()(тот, который принимает и viewName и masterName).

Попробуйте передать его как object, чтобы соответствовать правильной перегрузке:

return View("Index", EmpResponse as object);

Лучшим подходом было быдля сохранения полученных данных в виде строго типизированной коллекции объектов:

var empResponse = await Res.Content.ReadAsAsync<IEnumerable<Employee>>();

Затем передайте их как модель представления:

return View("Index", empResponse);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...