[英]ASP.NET MVC - How do I Call a Controller Method from within a View to Redirect to Multiple Other Views?
[英]How do I call a method that returns a Task<T> From an ASP.Net MVC4 Controller Method?
TL; DR:我想知道如何从从ASP.Net MVC4控制器的ActionResult
方法调用时返回Task<T>
的方法中获取返回值。 下面的代码段。
问题详细信息:
我在github上使用Instasharp库 。
这是返回Task<UserResponse>
的Search
方法。 这在Instasharp库中定义。
/// <summary>
/// Search for a user by name.
/// <para>
/// <c>Requires Authentication: False</c>
/// </para>
/// </summary>
/// <param name="searchTem">A query string.</param>
/// <param name="count">Number of users to return.</param>
/// <returns>UsersResponse</returns>
public Task<UsersResponse> Search(string searchTerm, int? count = null) {
var request = base.Request("search");
request.AddParameter("q", searchTerm);
request.AddParameter("count", count);
return base.Client.ExecuteAsync<UsersResponse>(request);
}
这是同一库项目的源代码中有效的单元测试。 如果我在Assert
行中放置一个断点并检查result
,则该断点包含List<UserResponse>
的实例,该实例具有来自Instagram API的数据。
[TestMethod, TestCategory("Users.Search")]
public async Task Search()
{
var result = await users.Search("shiva");
Assert.IsTrue(result.Data.Count > 0);
}
在我的ASP.Net MVC4应用程序的HomeController
,在Index
方法中将查询instagram API,并将强类型List<Instasharp.Models.User>
(包含在UserResponse
对象的Data
属性中)返回到相应的View,代码如下。 (注意:这是基于Github页面上的文档,应该可以使用。)
public class HomeController : Controller
{
public ActionResult Index()
{
var userList = new List<InstaSharp.Models.User>();
var mediaList = new List<InstaSharp.Models.Media>();
var followingList = new List<InstaSharp.Models.User>();
try
{
var config = new InstaSharp.InstagramConfig(
clientId:"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM",
clientSecret:"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
InstaSharp.Endpoints.Users users = new InstaSharp.Endpoints.Users(config);
var result = users.Search("shiva");
userList = result.Result.Data;
}
catch (Exception ex)
{
ViewBag.Message = ex.Message + "\n\n" + ex.StackTrace.ToString();
}
return View(userList);
}
}
问题:
我的代码正在挂起(即localhost:portnumber
正在等待。)。 使用Instagram API进行身份验证没有问题。 线
var result = users.Search("shiva");
显示结果是一个Task
。 我不确定如何调用它并从users.Search("shiva")
方法的返回值中获取Data
。
我尝试过的
我试着加入await
在前面users.Search("shiva")
调用。 然后,编译器要求我使ActionResult Index()
也async
并在其周围包装Task<..>
。 当我也这样做时,代码就挂了。 我也尝试在本教程中查看MSDN,但这也无济于事。 我已经花了很多时间在此上,并希望有人能帮助我。
[注意:这不是生产代码。 我只是想让Instasharp库在ASP.Net MVC4控制器中工作并在视图中显示数据。 因此,请不要着迷于编码实践等。此外,对于这个问题,我还伪造了ClientId
和ClientSecret
。 我认为您不需要它来回答这个问题。]
为了正确地调用MVC4 +中的async
方法,您应该通过返回Task<ActionResult>
并使用await
等待async
方法的完成来使操作async
。
以下MSDN文章在ASP.NET MVC 4中使用异步方法 (以及许多其他文章)中进行了详细介绍。 以下文章的样本:
public async Task<ActionResult> GizmosAsync()
{
var gizmoService = new GizmoService();
var result = await gizmoService.GetGizmosAsync();
return View("Gizmos", result);
}
请注意,在ASP.Net中使用Wait
或Result
将导致死锁(如您所观察)。 有很多讨论它的问题/文章-即等待vs Task.Wait-死锁?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.