首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Asp.Net MVC中返回异步任务中的视图和模型

如何在Asp.Net MVC中返回异步任务中的视图和模型
EN

Stack Overflow用户
提问于 2018-12-31 13:16:02
回答 2查看 5.6K关注 0票数 2

我正在MVC中测试异步任务,并在下面的代码中创建异步任务。当我与视图名return View("Index", EmpResponse)一起返回模型值时,就会出现错误。但是如果我只是返回视图return view()。它运行得很好。

代码语言:javascript
运行
复制
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中,我知道我们可以一起返回视图名称和模型。异步任务有问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-31 13:28:50

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

你的模型是字符串。但是View()的重载(需要第二个字符串)使用它来查找一个命名的视图。这就是为什么它要寻找一个名为您的长JSON字符串的视图。(嗯,本例中的“主视图”,因为您要发送两个字符串。)

不要使用字符串作为模型。用模型。与其向视图发送一个大的JSON字符串,不如将其反序列化为某种类型的模型。类型由您决定,但反序列化看起来可能如下所示:

代码语言:javascript
运行
复制
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,可能会出现问题,这取决于您的视图在做什么。(无论哪种方式,如果您的视图当前期望字符串作为模型,则必须进行更改。)在没有可用模型的情况下,可能会重定向或返回错误?您的系统应该如何运行的逻辑取决于您。

票数 2
EN

Stack Overflow用户

发布于 2018-12-31 13:21:50

您的目的是将EmpResponse作为Index视图的视图模型传递,但是由于您已经将EmpResponse反序列化为string,所以它与View()助手方法(既接受viewName又接受masterName)的重载错误匹配。

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

代码语言:javascript
运行
复制
return View("Index", EmpResponse as object);

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

代码语言:javascript
运行
复制
var empResponse = await Res.Content.ReadAsAsync<IEnumerable<Employee>>();

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

代码语言:javascript
运行
复制
return View("Index", empResponse);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53987939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档