使用angular2中的对象调用.net核心控制器get方法
我有一个角度分量:使用angular2中的对象调用.net核心控制器get方法,.net,asp.net-mvc,angular,asp.net-web-api,asp.net-core,.net,Asp.net Mvc,Angular,Asp.net Web Api,Asp.net Core,我有一个角度分量: import { Component } from '@angular/core'; import { Http } from '@angular/http'; @Component({ selector: 'search', template: require('./search.component.html'), styles: [require('./search.component.css')] }) export class Search
import { Component } from '@angular/core';
import { Http } from '@angular/http';
@Component({
selector: 'search',
template: require('./search.component.html'),
styles: [require('./search.component.css')]
})
export class SearchComponent {
public tumorType = "Tymor Type";
public gene = "Gene";
public searchList: any[];
public searchCriteria:
{
TumorType: string;
Gene: string;
Country: string;
} =
{
TumorType: "Acute Lymphoblastic Leukemia",
Gene: "ABL",
Country: "Australia"
};
constructor(private http: Http) {
}
public search() {
let searchCrit = this.searchCriteria;
this.http.get('/api/RocheClinicalTrial/' + JSON.stringify({ searchCrit })).subscribe(result => {
//this.searchList = result.json();
console.log(result);
});
}
}
和一个mvc控制器
namespace RocheClinicalTrial.Controllers
{
[AllowAnonymous]
[Route("api/[controller]")]
public class RocheClinicalTrialController : Controller
{
// GET: api/values
[HttpGet]
public JsonResult Get()
{
var repo = new Repository.Repository();
var data = repo.GetData();
return Json(data);
}
[Route("GetData")]
//GET api/values/5
[HttpGet("api/values")]
public string Get(string searchCriteria)
{
System.Console.WriteLine(searchCriteria);
return "value";
}
}
}
这应该称为
Getstring搜索条件
方法。但是电话没有接通。但是当我没有价值的呼唤
this.http.get'/api/RocheClinicalTrial/'/+JSON.stringify{
searchCrit}/.subscriberesult=>{
//this.searchList=result.json;
console.logresult;
};
它称之为
公共JsonResult Get
方法。你能帮忙吗
这是“网络”选项卡中的通话截图
如果要绑定搜索条件,请修改api url,使其如下所示: api/RocheClinicalTrial?searchCriteria=yourSearchCriteria 如果尚未指定与此匹配的MVC路由,则需要执行此操作。 因此,基本上额外的参数与MVC端的相同内容匹配,然后MVC引擎可以自动为您映射该值 这还意味着您必须对搜索字符串进行URL编码,否则可能会有无效的URL
如果我是你,我不会使用GET来实现这个方法,而是使用POST并传递其中的数据。别忘了url有一个字符限制,所以不能太长如果要绑定搜索条件,请修改api url,使其看起来像这样: api/RocheClinicalTrial?searchCriteria=yourSearchCriteria 如果尚未指定与此匹配的MVC路由,则需要执行此操作。 因此,基本上额外的参数与MVC端的相同内容匹配,然后MVC引擎可以自动为您映射该值 这还意味着您必须对搜索字符串进行URL编码,否则可能会有无效的URL
如果我是你,我不会使用GET来实现这个方法,而是使用POST并传递其中的数据。别忘了URL有字符限制,所以不能太长我找到了一个解决方案 这是我从客户端打来的电话:
this.http.get('/api/RocheClinicalTrial/Details/' + this.searchCriteria).subscribe(result => {
//this.searchList = result.json();
console.log(result);
});
这是我的控制器:
namespace RocheClinicalTrial.Controllers
{
[AllowAnonymous]
[Route("api/RocheClinicalTrial")]
public class RocheClinicalTrialController : Controller
{
// GET: api/values
[HttpGet]
public JsonResult Get()
{
var repo = new Repository.Repository();
var data = repo.GetData();
return Json(data);
}
[Route("Details/{ItemName}")]
//GET api/values/5
[HttpGet("api/values")]
public string Get(SearchCriteria searchCriteria)
{
System.Console.WriteLine(searchCriteria);
return "value";
}
}
}
我找到了解决办法 这是我从客户端打来的电话:
this.http.get('/api/RocheClinicalTrial/Details/' + this.searchCriteria).subscribe(result => {
//this.searchList = result.json();
console.log(result);
});
这是我的控制器:
namespace RocheClinicalTrial.Controllers
{
[AllowAnonymous]
[Route("api/RocheClinicalTrial")]
public class RocheClinicalTrialController : Controller
{
// GET: api/values
[HttpGet]
public JsonResult Get()
{
var repo = new Repository.Repository();
var data = repo.GetData();
return Json(data);
}
[Route("Details/{ItemName}")]
//GET api/values/5
[HttpGet("api/values")]
public string Get(SearchCriteria searchCriteria)
{
System.Console.WriteLine(searchCriteria);
return "value";
}
}
}
我对这里的目标有点困惑。我在这里看到两种可能的api url 第一:
api/RocheClinicalTrial?searchCriteria=yourSearchCriteria
对于这一点,当前示例应该可以工作。但是您只需要使用一个操作,并确保查询参数searchCriteria不为null或空
namespace RocheClinicalTrial.Controllers
{
[AllowAnonymous]
[Route("api/[controller]")]
public class RocheClinicalTrialController : Controller
{
// GET: api/values
[HttpGet]
public JsonResult Get(string searchCriteria)
{
if (string.IsNullOrWhiteSpace(searchCriteria))
{
var repo = new Repository.Repository();
var data = repo.GetData();
return Json(data);
}
// Return back full payload.
}
}
}
编号2:用于角度2组件的编号
api/RocheClinicalTrial/yourSearchCriteria
下面的内容就足够了
namespace RocheClinicalTrial.Controllers
{
[AllowAnonymous]
[Route("api/[controller]")]
public class RocheClinicalTrialController : Controller
{
// GET: api/values
[HttpGet]
public JsonResult Get()
{
var repo = new Repository.Repository();
var data = repo.GetData();
return Json(data);
}
[HttpGet("{searchCriteria}")]
public string Get(string searchCriteria)
{
System.Console.WriteLine(searchCriteria);
return "value";
}
}
}
现在,这里有一个温柔的提醒。根据IE的说法,url长度是有限的,是2083个字符。对于其他浏览器和客户端,它可能在同一区域漫游
要发送回正确的json负载,最好使用POST
那么,类似于以下内容的内容将很有用:
namespace TestApp.Controllers
{
[Route("api/[controller]")]
public class ValuesController : Controller
{
[HttpGet]
public JsonResult Get()
{
var data = "I'm the default one";
return Json(data);
}
[HttpPost]
public IActionResult Get([FromBody] SearchCriteria searchCriteria)
{
return new ObjectResult(searchCriteria);
}
}
}
Angular 2发出的post请求示例如下:
public search() {
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
let searchCrit = this.searchCriteria;
this.http.post('/api/RocheClinicalTrial/', searchCrit, options)
.subscribe(result => {
console.log(result);
});
}
我对这里的目标有点困惑。我在这里看到两种可能的api url 第一:
api/RocheClinicalTrial?searchCriteria=yourSearchCriteria
对于这一点,当前示例应该可以工作。但是您只需要使用一个操作,并确保查询参数searchCriteria不为null或空
namespace RocheClinicalTrial.Controllers
{
[AllowAnonymous]
[Route("api/[controller]")]
public class RocheClinicalTrialController : Controller
{
// GET: api/values
[HttpGet]
public JsonResult Get(string searchCriteria)
{
if (string.IsNullOrWhiteSpace(searchCriteria))
{
var repo = new Repository.Repository();
var data = repo.GetData();
return Json(data);
}
// Return back full payload.
}
}
}
编号2:用于角度2组件的编号
api/RocheClinicalTrial/yourSearchCriteria
下面的内容就足够了
namespace RocheClinicalTrial.Controllers
{
[AllowAnonymous]
[Route("api/[controller]")]
public class RocheClinicalTrialController : Controller
{
// GET: api/values
[HttpGet]
public JsonResult Get()
{
var repo = new Repository.Repository();
var data = repo.GetData();
return Json(data);
}
[HttpGet("{searchCriteria}")]
public string Get(string searchCriteria)
{
System.Console.WriteLine(searchCriteria);
return "value";
}
}
}
现在,这里有一个温柔的提醒。根据IE的说法,url长度是有限的,是2083个字符。对于其他浏览器和客户端,它可能在同一区域漫游
要发送回正确的json负载,最好使用POST
那么,类似于以下内容的内容将很有用:
namespace TestApp.Controllers
{
[Route("api/[controller]")]
public class ValuesController : Controller
{
[HttpGet]
public JsonResult Get()
{
var data = "I'm the default one";
return Json(data);
}
[HttpPost]
public IActionResult Get([FromBody] SearchCriteria searchCriteria)
{
return new ObjectResult(searchCriteria);
}
}
}
Angular 2发出的post请求示例如下:
public search() {
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
let searchCrit = this.searchCriteria;
this.http.post('/api/RocheClinicalTrial/', searchCrit, options)
.subscribe(result => {
console.log(result);
});
}
你查过网络标签了吗?看看请求去了什么地方……是的,我去了。即使我直接点击url localhost:52086/api/RocheClinicalTrial/something,它也会调用。呼叫没有到达那里。请尝试控制台整个请求url,并查看什么是方向。您可以共享网络选项卡详细信息的屏幕截图吗?当我在get method上取消保存某些路由参数时,我们的控制器方法会出现问题。您检查了网络选项卡吗?看看请求去了什么地方……是的,我去了。即使我直接点击url localhost:52086/api/RocheClinicalTrial/something,它也会调用。调用没有转到那里。请尝试控制台整个请求url,看看是什么方向。您可以共享网络选项卡详细信息的屏幕截图吗?当我在get method上取消保存某些路由参数时,您的控制器方法存在问题。用[HttpPost]装饰控制器get方法是一个好主意吗?是否存在与此相关的安全漏洞?似乎违反直觉。用[HttpPost]装饰控制器Get方法是个好主意吗?是否存在与此相关的安全漏洞?这似乎违反直觉。