【问题标题】:Why I get error message Operator '||' cannot be applied to operands of type 'bool' and 'int'为什么我收到错误消息 Operator '||'不能应用于“bool”和“int”类型的操作数
【发布时间】:2021-03-22 12:16:48
【问题描述】:

当我想将UserID 传递给我的控制器并限制对Ticket 的访问时,我收到以下错误消息 所以每个用户只能看到自己的票,但是Admin可以看到所有的票。

    var obj = _unitOfwork.Ticket.GetAll(filter: x => isAdministrator || x.UserId == account.FirstOrDefault().Id, includeProperties: "TicketType,ApplicationUser"); 

到目前为止,我尝试的是这样的:

方法一

   var obj = _unitOfwork.Ticket.GetAll(filter: x => isAdministrator || x.UserId = account.FirstOrDefault().Id, includeProperties: "TicketType,ApplicationUser"); 

方法二

   var obj = _unitOfwork.Ticket.GetAll(filter: (x => isAdministrator || x.UserId = account.FirstOrDefault().Id), includeProperties: "TicketType,ApplicationUser"); 

方法 3(当我使用这样的东西时,我得到 x 作为不存在的上下文)

The name 'x' does not exist in the current context       

  var obj = _unitOfwork.Ticket.GetAll(filter: (x => isAdministrator) || (x.UserId = account.FirstOrDefault().Id), includeProperties: "TicketType,ApplicationUser"); 

我不知道我在哪里犯了错误以及我做错了什么,但无论我尝试什么,我总是收到错误消息。 我在这里检查了几个帖子

Post 1

Post 2

知道如何解决这个问题吗?

更新

这是我这个函数的完整代码

public IActionResult GetAll()
        {
            var username = User.FindFirst(ClaimTypes.Name).Value;
            var account = _unitOfwork.ApplicationUser.GetFirstOrDefault(a => a.UserName.Equals(username));
            var isAdministrator = User.IsInRole("Admin");
            var obj = _unitOfwork.Ticket.GetAll(filter: x => x.isAdministrator || x.UserId == account.FirstOrDefault().Id, includeProperties: "TicketType,ApplicationUser");
            return Json(new { data = obj });
        }

【问题讨论】:

  • 你试试括号吗? isAdministrator || (x.UserId == account.FirstOrDefault().Id)
  • 他尝试过,但在所示示例中,他使用了= 而不是==
  • 您是否注意到account.FirstOrDefault() 可以返回默认值,可能是null?
  • 我要问,什么是传递用户ID给控制器?如果这是来自浏览器(或任何客户端控制器用户代理),您必须意识到任何人都可以伪造他们想要的任何用户 ID。
  • 您描述了您尝试的 3 种方法。但是在所有 3 中,您都使用 = 运算符进行赋值,而不是与 == 进行比较。所以我有点困惑,因为在你最初的代码行中,你实际上是用 == 进行比较。你能提供更多关于这方面的信息吗?

标签: c# entity-framework-core asp.net-core-mvc


【解决方案1】:

在您的方法中,您使用了= 而不是==,这与== 不同,== 是一个比较并且具有布尔结果= 正在分配,其值由int 的变量类型确定在你的情况下(x.UserId)。而|| 只能应用于布尔类型:

(x => isAdministrator) || (x.UserId = account.FirstOrDefault().Id)
//-------boolean-------    ---int---

【讨论】:

  • 不,它不起作用!我更新我的问题。看Update部分
  • 我已经有了这个解决方案,它抛出错误消息为The name 'x' does not exist in the current context
【解决方案2】:

从你的初始代码开始(假设 isAdministrator 是一个布尔值)

var obj = _unitOfwork.Ticket.GetAll(filter: x => x.isAdministrator || x.UserId == account.FirstOrDefault().Id, includeProperties: "TicketType,ApplicationUser");

【讨论】:

    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多