我正在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中,我知道我们可以一起返回视图名称和模型。异步任务有问题吗?
答案 0 :(得分:1)
您的意图是将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);
答案 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
,根据您的视图在做什么,可能会出现问题。 (如果当前希望将字符串作为模型,则无论哪种方式您的视图都必须更改。)在没有可用模型的情况下,也许重定向或返回错误?系统的行为逻辑取决于您自己。