如何在Asp.Net MVC中的Async任务中返回视图以及模型

时间:2018-12-31 13:16:02

标签: asp.net-mvc async-await

我正在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 :(得分:1)

您的意图是将EmpResponse作为Index视图的视图模型,但是由于您已经将EmpResponse反序列化为string,因此它匹配了错误的View()帮助方法(同时接受viewNamemasterName的帮助方法的重载。)

尝试将其作为object传递以匹配正确的重载:

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

更好的方法是将接收到的数据存储为对象的强类型集合:

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

然后将其作为视图模型传递:

return View("Index", empResponse);

答案 1 :(得分:1)

这实际上不是异步问题,而是模型类型问题。 (尽管有一个 异步问题正在等待成为一个问题...不要直接调用.Result,而要使用await来获得结果。)

您的模型是一个字符串。但是View()的重载需要第二个字符串,它使用它来找到一个命名视图。这就是为什么它正在寻找一个名为 的长JSON字符串视图的原因。 (嗯,a "master view" in this case,因为您要向它发送两个字符串。)

请勿将字符串用作模型。使用模型。与其向您的视图发送一个大的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中甚至可以选择直接读取/反序列化为模型,从而在上面节省了一行代码。但是总体原理是相同的。使用强类型模型而不是复杂的序列化字符串。

*在这种情况下,根据我们看到的序列化JSON,YourModelTypeHere看起来实际上是IEnumerable<YourModel>IList<YourModel>

*还请注意,如果没有成功检索到任何视图,这将使用您当前的逻辑将空模型发送到同一视图。对于可能没问题的空字符串,对于null,根据您的视图在做什么,可能会出现问题。 (如果当前希望将字符串作为模型,则无论哪种方式您的视图都必须更改。)在没有可用模型的情况下,也许重定向或返回错误?系统的行为逻辑取决于您自己。