我正在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);
            }
        }

在简单的ActionResult中,我知道我们可以一起返回视图名称和模型。异步任务有问题吗?
发布于 2018-12-31 13:28:50
这实际上不是异步问题,而是模型类型问题。(虽然有一个异步问题等待成为一个问题.不要直接调用.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中甚至可能有一个选项可以直接将模型读取/反序列化,从而节省了上面的一行代码。但总体原则是一样的。使用强类型模型而不是复杂的序列化字符串。
*在本例中,基于我们正在看到的序列化JSON,YourModelTypeHere看起来实际上是一个IEnumerable<YourModel>或IList<YourModel>。
*还请注意,如果没有检索到任何内容,则使用当前的逻辑将空模型发送到相同的视图。对于可能没有问题的空字符串,对于null,可能会出现问题,这取决于您的视图在做什么。(无论哪种方式,如果您的视图当前期望字符串作为模型,则必须进行更改。)在没有可用模型的情况下,可能会重定向或返回错误?您的系统应该如何运行的逻辑取决于您。
发布于 2018-12-31 13:21:50
您的目的是将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);https://stackoverflow.com/questions/53987939
复制相似问题