2017-02-05 44 views
1

对象我有一个角状的部件:调用.NET核心控制器get方法与angular2

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"; 
     } 
} 
} 

这应该叫

获取(string searchCriteria)

方法。但电话没有发生。但是,当我打电话而不值

this.http.get( '/ API/RocheClinicalTrial /'/ + JSON.stringify({ searchCrit}) /).subscribe(result => {// this.searchList = result.json(); console.log(result); });

它调用

公共JsonResult获得()

方法。你能帮忙吗?

下面是从网络选项卡中的通话截图

enter image description here

+0

你检查网络选项卡?看看什么和请求去了哪里..? –

+0

是的,我做过。它称为“http:// localhost:52086/api/RocheClinicalTrial /%7B%22searchCrit%22:%7B%22TumorType%22:%22Acute%20Lymphoblastic%20Leukemia%22,%22Gene%22:%22ABL%22,%22Country %22:%22Australia%22%7D%7D“ 即使我直接命中url localhost:52086/api/RocheClinicalTrial/something。通话不会去那里。 – Anurag

+0

尝试控制整个请求url,看看有什么区别 –

回答

1
,如果你要绑定的搜索条件,然后修改您的API URL,所以它看起来像这样

api/RocheClinicalTrial?searchCriteria=yourSearchCriteria

你如果你没有指定一个MVC路线来匹配这个,就需要这样做。 所以基本上多余的参数匹配MVC端的相同内容,然后MVC引擎可以为您自动映射该值。

这也意味着你必须对你的搜索字符串进行URL编码,否则你可能会有一个无效的URL。

如果我是你,我不会使用GET方法,使用POST并将数据传递给它。不要忘了URL有字符限制,所以你不能让它们太长

0

我发现了一个解决方案。

下面是从客户端的我的电话:

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"; 
     } 
} 
} 
3

我对什么是这里的目标糊涂一点点。我在这里看到两种可能的API url可能性。

数1:

api/RocheClinicalTrial?searchCriteria=yourSearchCriteria 

为此,当前样本 “应该” 的工作。但是您只需要使用一个操作并确保查询参数searchCriteria不为空或为空。

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它是2,083个字符。它可能在其他浏览器和客户端的同一地区漫游。

要发回适当的json有效负载,最好使用POST。

像下面将使用的则:从角2

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); 
     } 
    } 
} 

样本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); 
      }); 

    }