【问题标题】:How to call action result return json on another action result on asp.net core 2.2?如何在asp.net core 2.2上的另一个动作结果上调用动作结果返回json?
【发布时间】:2020-01-13 07:10:15
【问题描述】:

问题

如何在另一个动作结果上调用动作结果?

我有两个 Action Result PostUserLogins 和 Action Result GetBranches

我可以在 ActionResult postlogin 中调用 ActionResult getbranches 吗?

[HttpPost(Contracts.ApiRoutes.Login.UserLogin)]
        public IActionResult PostUserLogins([FromBody] Users user)
        {
if (LoginStatus == 1)
            {
                // for Invalid Username Or password
                dynamic request_status = new JObject();
                request_status.Status = "failed";
                request_status.Code = LoginStatus;
                request_status.Message = errorMessage;
                request_status.Branches = ????? How to call GetBranches Action;
               // call action result to get  GetBranches(Users user) as json;
                JsonResults = "request_status" + JsonConvert.SerializeObject(request_status);


        }

        }
 [HttpGet(Contracts.ApiRoutes.Login.GetBranches)]
        public IActionResult GetBranches([FromRoute] string UserId)
        {


 List<Branches> branchesList = new List<Branches>();
                for (int i = 0; i < dtBranches.Rows.Count; i++)
                {
                    Branches branch = new Branches();
                    branch.BranchCode = Utilities.ObjectConverter.ConvertToInteger(dtBranches.Rows[i]["BranchCode"]);
                    branch.BranchName = Utilities.ObjectConverter.ConvertToString(dtBranches.Rows[i]["BranchAraName"]);
                    branchesList.Add(branch);

            }
JsonResults = "request_status" + JsonConvert.SerializeObject(branchesList);
return Ok(JsonResults);
        }

【问题讨论】:

  • 不要。在单独的方法中提取代码并从两个操作中调用它

标签: asp.net-mvc-4 asp.net-core c#-7.0


【解决方案1】:

不管你能不能,你都不应该。

最简单的方法是将该逻辑提取到另一个方法中:

[HttpPost(Contracts.ApiRoutes.Login.UserLogin)]
public IActionResult PostUserLogins([FromBody] Users user)
{
    if (LoginStatus == 1)
    {
        // for Invalid Username Or password
        dynamic request_status = new JObject();
        request_status.Status = "failed";
        request_status.Code = LoginStatus;
        request_status.Message = errorMessage;
        request_status.Branches = GetBrancesImpl();
        JsonResults = "request_status" + JsonConvert.SerializeObject(request_status);
    }
}
[HttpGet(Contracts.ApiRoutes.Login.GetBranches)]
public IActionResult GetBranches([FromRoute] string UserId)
{
    JsonResults = "request_status" + JsonConvert.SerializeObject(GetBrancesImpl());
    return Ok(JsonResults);
}
private IEnumerable<Branches> GetBrancesImpl()
{
    from branch in dtBranches.Rows
    select new new Branches
        {
            BranchCode = Utilities.ObjectConverter.ConvertToInteger(dtBranches.Rows[i]["BranchCode"]),
            BranchName = Utilities.ObjectConverter.ConvertToString(dtBranches.Rows[i]["BranchAraName"]),
        };
}

最好将此逻辑移动到一个服务类中,该类包含该逻辑并且可以轻松进行测试。

【讨论】:

    【解决方案2】:

    如果它们在同一个控制器中,您可以直接在PostUserLogins 中调用它,例如:

    public IActionResult PostUserLogins([FromBody] Users user)
        {
            //other logic
    
            var result = GetBranches("myUserID") as OkObjectResult;
    
            var json = result.Value.ToString().Substring(14);//remove the first "request_status" in the string to make it a valid json  be deserialized later
    
            request_status.Branches = JsonConvert.DeserializeObject<List<Branch>>(json);//get the Branch list
    
            JsonResults = "request_status" + JsonConvert.SerializeObject(request_status);
    
        }
    

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多