2017-11-14 9 views
0

aurelia-fetch-client를 사용하여 ASP.NET 핵심 웹 응용 프로그램으로 Guids 배열을 보내고 있지만 서버 측에서는 모델 바인더가 가져 가지 않습니다. notificationIds의 목록은 null입니다. 그러나 내가 Swagger 또는 CURL을 통해 요청을하면 잘 바인딩됩니다.Guides의 모델 바인딩이 아닌 Asp.Net 코어

GUID 형식에 문제가있는 경우를 대비하여 문자열 목록을 허용하기 위해 내 컨트롤러 메서드의 서명을 변경했지만 같은 문제가 발생합니다.

JS

var body = {notificationIds : this.notifications.map(x => x.notificationId) }; 
    console.log("Dismissing All notifications"); 

    await this.httpClient.fetch('http://localhost:5000/api/notifications/clear', 
     { 
      method: 'POST', 
      body: json(body), 
      headers: { 
       'Authorization': `Bearer ${localStorage.getItem('access_token')}`, 
       'Accept': 'application/json', 
       'Content-Type': 'application/json', 
       'X-Requested-With': 'Fetch' 
      }, 
      mode: 'cors' 
     }).then(response => { 
      if(response.status == 204){ 
       //Success! Remove Notifications from VM 
      } 
      else{ 

       console.log(response.status) 
      } 
     }) 

컨트롤러 방법

// POST: api/Notifications 
     [HttpPost] 
     [Route("clear")] 
     [ProducesResponseType((int)HttpStatusCode.NoContent)] 
     [ProducesResponseType((int)HttpStatusCode.BadRequest)] 
     public async Task<IActionResult> Post([FromBody]List<string> notificationIds) 
     { 
      if (notificationIds.IsNullOrEmpty()) 
      { 
       return BadRequest("No notifications requested to be cleared"); 
      } 

      var name = User.Claims.ElementAt(1); 

      await _notificationRepository.Acknowledge(notificationIds, name.Value); 

      return NoContent(); 
} 

흥미로운 점은 크롬 (V62)은 아무것도 게시 보여줍니다 없다는 것입니다. enter image description here

그러나 피들러는

enter image description here

+0

반환 된 데이터를 내가 볼 수있는 VM의 모든 속성으로 설정하지 않습니다. –

+0

VM에서 아무 것도 설정하고 싶지 않습니다. 사실 guids 목록을 게시 할 때 서버의 모델 바인더가 문제를 해결하지 못합니다. – MrBliz

+0

Ah. 나는 그 질문을 완전히 잘못 읽었다. 미안합니다. –

답변

1

자바 스크립트에서 전달하는 객체의 모양을하지 당신이 ASP.NET 프레임 워크가 기대 말하고있다 물체의 같은 모양이 아니다.

이 문제를 해결할 수있는 두 가지 방법이 있습니다, var body = this.notifications.map(x => x.notificationId);

옵션 2에 몸을 변경하여 자바 스크립트에서 :

옵션 1 C#에서 객체를 만들기가 JavaScript에서 전달한 내용을 반영합니다.

namespace Foo 
{ 
    public class Bar 
    { 
    public List<string> NotificationIds { get; set; } 
    } 
} 

다음은 다음에 컨트롤러 메소드를 업데이트

// POST: api/Notifications 
[HttpPost] 
[Route("clear")] 
[ProducesResponseType((int)HttpStatusCode.NoContent)] 
[ProducesResponseType((int)HttpStatusCode.BadRequest)] 
public async Task<IActionResult> Post([FromBody]Bar bar) 
{ 
    if (bar.NotificationIds.IsNullOrEmpty()) 
    { 
    return BadRequest("No notifications requested to be cleared"); 
    } 

    var name = User.Claims.ElementAt(1); 
    await _notificationRepository.Acknowledge(bar.NotificationIds, name.Value); 
    return NoContent(); 
} 
1

여기에서의 문제는 당신이 목록을 포함하는 속성 객체를 전송하는 GUID 목록을 전송하지 않을 것입니다 GUID 중. peinearydevelopment에서 설명한대로 뷰 모델을 만들고 사용하거나 json 객체를 참조하는 dynamic 매개 변수를 허용하십시오.

public async Task<IActionResult> Post([FromBody] dynamic json) 
{ 
    var notificationIds = json.notifcationIds; 
    ...