【问题标题】:Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Web.Mvc.ActionResult'无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Web.Mvc.ActionResult”
【发布时间】:2016-07-18 09:02:38
【问题描述】:

我正在使用 ASP.NET MVC5 Identity 并尝试实现基于声明的身份验证。

我收到以下错误:

无法将类型“System.Collections.Generic.IEnumerable>”隐式转换为“System.Web.Mvc.ActionResult”。存在显式转换(您是否缺少演员表?)

这是一段代码:

public ActionResult GetClaims()
{
    var identity = User.Identity as ClaimsIdentity;
    var claims = from c in identity.Claims
                 select new
                 {
                     subject = c.Subject.Name,
                     type = c.Type,
                     value = c.Value
                 };
    return claims;
}

我正在关注http://bitoftech.net/2015/03/31/asp-net-web-api-claims-authorization-with-asp-net-identity-2-1/的示例

【问题讨论】:

  • 你的方法是做什么的 - 它是否返回一个视图 - 即它需要是 return view(claims); (尽管你创建了一个匿名对象以便在视图中不起作用)或者你返回 json一个ajax调用?还是只是您在其他地方使用的一种方法?

标签: asp.net-mvc asp.net-identity claims-based-identity


【解决方案1】:

如果它在 MVC 控制器中,您应该返回一个视图,该视图接受 IEnumerable<Claim> 作为模型:

public ActionResult GetClaims()
{
    var identity = User.Identity as ClaimsIdentity;
    var claims = from c in identity.Claims
                 select new
                 {
                     subject = c.Subject.Name,
                     type = c.Type,
                     value = c.Value
                 };
    return View(claims);
}

如果是在 api 控制器中你可以返回IHttpActionResult

public IHttpActionResult GetClaims()
{
    var identity = User.Identity as ClaimsIdentity;
    var claims = from c in identity.Claims
                 select new
                 {
                     subject = c.Subject.Name,
                     type = c.Type,
                     value = c.Value
                 };
    return Ok(claims);
}

【讨论】:

  • 如果走api路由,返回具体类的IEnumerable<ClaimView>也完全OK
  • @jenson-button-event 除非具体类型实现 IHttpActionResult,否则它不会编译。
  • public IEnumerable<ClaimView> GetClaims() 是我的意思。完全可以接受的 web api 方法。或者public IEnumerable<object> GetClaims()如果你想匿名返回
  • @jenson-button-event 我明白你的意思。是的,这很好。
【解决方案2】:

几件事。您尝试将匿名类型的可枚举返回为ActionResult。通常,ActionResults 期望您返回对模型中传递的视图(剃刀模板)的引用:

return View(model);

如果你只想返回数据,那么你需要返回一个JsonResult

return Json(new { Data = model }, JsonRequestBehavior.AllowGet);

【讨论】:

  • 谢谢,我只是返回数据,所以 Json 方法有效。
  • 匿名类型在返回 JsonResult 时很好(只是在返回视图时不行)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多