跨不同方法共享同一对象并在 C# web 中进行相应更新 API
Sharing same object across different methods and update accordingly in C# web API
为我糟糕的英语和可能是一个愚蠢的问题道歉。我是 C# web 的初学者 api.
我想做的只是在 c# 中进行一些数据操作并从 Web API 响应前端 (Angular)。
这是我的标记方式
控制器
[HttpGet]
public async Task<ProjectResult> Get(ProjectDetails d)
{
return Ok(_myclass.ProcessData(d));
}
Class 定义
public class ProjectDetails{
public int pId{get;set;}
public string pName{get;set;}
}
public class ProjectResult{
public datetime startedAt(get;set;)
public int TotalProcessed(get;set;)
public string remark(get;set;)
public int TotalRowsAdded(get;set;)
}
public class myClass{
readonly projectdetails d;
public myClass(){
d = new projectdetails();
}
public async Task<ProjectResult> ProcessData(ProjectDetails d){
d.startedAt=now();
}
private void method1(){
d.TotalProcessed=10;
//some code
}
private void method2(){
d.TotalRowsAdded=100;
//some code
}
private void method3(){
//some code
d.remark="method 3 finished";
}
}
所以我认为你满足了我的要求。我需要 return ProjectResult 数据到前端 SPA。并且需要在每个方法中更新项目结果对象。
那么这是正确的方法吗?请帮我解决这个问题
根据 WebAPI 标准,HTTPGET 不接受任何请求负载。所以,
- 要么将您的控制器操作更改为 HTTPPOST,以便您可以从 Angular 客户端发送请求负载。
[HttpPost] [Route("api/projects")] public IHttpActionResult GetProjectResult(ProjectDetails d) { return Ok(_myclass.ProcessData(d)); }
- 或修改您的 HTTPGET 以通过路由接受(请参阅属性路由了解如何执行此操作),如下所示:
[HttpGet] [Route("api/projects/{pId}/results/{pName}")] public IHttpActionResult GetProjectResult(int pId, string pName) { return Ok(_myclass.ProcessData(new ProjectDetails{ pId = pId, pName = pName })); }
然后你像这样调用它:/api/projects/100/results/testproject.
话虽如此,因为您正在将 ProjectDetails 从 WebAPI 控制器传递到您的 ProcessData 方法,所以您不需要在 MyClass 中实例化。
由于问题中您的意图不是很清楚。因此,我假设您想在修改一些数据后 return ProjectResult。如果这是您的意图,则创建一个 ProjectResult 对象,如下所示,并在所有 MyClass 方法中使用该对象。由于 类 是“引用类型”,无论您对对象进行何种更改,它们都会出现在每个方法中。
public class myClass
{
/*readonly projectdetails d;*/
readonly ProjectResult r;
public myClass()
{
r = new ProjectResult();
}
public async Task<ProjectResult> ProcessData(ProjectDetails d)
{
r.startedAt = DateTime.Now;
method1();
method2();
method3();
return r;
}
private void method1()
{
r.TotalProcessed = 10;
//some code
}
private void method2()
{
r.TotalRowsAdded = 100;
//some code
}
private void method3()
{
//some code
r.remark = "method 3 finished";
}
}
这是您在控制器中访问的方式:
[HttpGet]
[Route("api/projects/{pId}/results/{pName}")]
public async Task<IHttpActionResult> Get(int pId, string pName)
{
/*
// If you want to access ProjectResult, access ProjectResult like below:
ProjectResult projectResult = await myClassObj.ProcessData(new ProjectDetails{ pId = pId, pName = pName });
// get or set values on ProjectResult like below
var totalProcessedRows = projectResult.TotalProcessed;
// Return the result.
return this.Ok(projectResult);
*/
// If you DON'T want to access ProjectResult, just return like below
return Ok(_myClassObj.ProcessData(new ProjectDetails { pId = pId, pName = pName }));
}
为我糟糕的英语和可能是一个愚蠢的问题道歉。我是 C# web 的初学者 api.
我想做的只是在 c# 中进行一些数据操作并从 Web API 响应前端 (Angular)。
这是我的标记方式
控制器
[HttpGet]
public async Task<ProjectResult> Get(ProjectDetails d)
{
return Ok(_myclass.ProcessData(d));
}
Class 定义
public class ProjectDetails{
public int pId{get;set;}
public string pName{get;set;}
}
public class ProjectResult{
public datetime startedAt(get;set;)
public int TotalProcessed(get;set;)
public string remark(get;set;)
public int TotalRowsAdded(get;set;)
}
public class myClass{
readonly projectdetails d;
public myClass(){
d = new projectdetails();
}
public async Task<ProjectResult> ProcessData(ProjectDetails d){
d.startedAt=now();
}
private void method1(){
d.TotalProcessed=10;
//some code
}
private void method2(){
d.TotalRowsAdded=100;
//some code
}
private void method3(){
//some code
d.remark="method 3 finished";
}
}
所以我认为你满足了我的要求。我需要 return ProjectResult 数据到前端 SPA。并且需要在每个方法中更新项目结果对象。
那么这是正确的方法吗?请帮我解决这个问题
根据 WebAPI 标准,HTTPGET 不接受任何请求负载。所以,
- 要么将您的控制器操作更改为 HTTPPOST,以便您可以从 Angular 客户端发送请求负载。
[HttpPost] [Route("api/projects")] public IHttpActionResult GetProjectResult(ProjectDetails d) { return Ok(_myclass.ProcessData(d)); }
- 或修改您的 HTTPGET 以通过路由接受(请参阅属性路由了解如何执行此操作),如下所示:
[HttpGet] [Route("api/projects/{pId}/results/{pName}")] public IHttpActionResult GetProjectResult(int pId, string pName) { return Ok(_myclass.ProcessData(new ProjectDetails{ pId = pId, pName = pName })); }
然后你像这样调用它:/api/projects/100/results/testproject.
话虽如此,因为您正在将 ProjectDetails 从 WebAPI 控制器传递到您的 ProcessData 方法,所以您不需要在 MyClass 中实例化。 由于问题中您的意图不是很清楚。因此,我假设您想在修改一些数据后 return ProjectResult。如果这是您的意图,则创建一个 ProjectResult 对象,如下所示,并在所有 MyClass 方法中使用该对象。由于 类 是“引用类型”,无论您对对象进行何种更改,它们都会出现在每个方法中。
public class myClass
{
/*readonly projectdetails d;*/
readonly ProjectResult r;
public myClass()
{
r = new ProjectResult();
}
public async Task<ProjectResult> ProcessData(ProjectDetails d)
{
r.startedAt = DateTime.Now;
method1();
method2();
method3();
return r;
}
private void method1()
{
r.TotalProcessed = 10;
//some code
}
private void method2()
{
r.TotalRowsAdded = 100;
//some code
}
private void method3()
{
//some code
r.remark = "method 3 finished";
}
}
这是您在控制器中访问的方式:
[HttpGet]
[Route("api/projects/{pId}/results/{pName}")]
public async Task<IHttpActionResult> Get(int pId, string pName)
{
/*
// If you want to access ProjectResult, access ProjectResult like below:
ProjectResult projectResult = await myClassObj.ProcessData(new ProjectDetails{ pId = pId, pName = pName });
// get or set values on ProjectResult like below
var totalProcessedRows = projectResult.TotalProcessed;
// Return the result.
return this.Ok(projectResult);
*/
// If you DON'T want to access ProjectResult, just return like below
return Ok(_myClassObj.ProcessData(new ProjectDetails { pId = pId, pName = pName }));
}