2017-10-10 3 views
1

POST를 통해 ASP.NET MVC 컨트롤러에 GUID 배열을 매개 변수로 전달하는 방법을 알아낼 수 없습니다. 내가 뭘 놓치고 있니? 이 작업을 수행하는 더 간단한 방법이 있습니까? 내 FooController에서ASP.NET MVC 매개 변수 바인딩 : 컨트롤러 메서드에 목록이나 배열을 POST하는 방법?

<form method="post" action="/Foo/Bar" > 
    <input name="itemIds" type="hidden" value="[&quot;8cd52539-c371-402a-b8be-12775f03ab68&quot;,&quot;8c97f9e0-666c-41ba-a914-72815745d1f0&quot;]"> 
    <button type="submit">Submit</button> 
</form> 

: HTML 결과

<form method="post" action="/Foo/Bar" > 
    <input name="itemIds" type="hidden" value="{{ ctrl.itemIds }}"> 
    <button type="submit">Submit</button> 
</form> 

: 내 AngularJS와 마크 업에서

내가 위의 디버깅 할 때

[System.Web.Mvc.HttpPost] 
public ActionResult Bar([FromBody]Guid[] itemIds) => ... 

, 내 HTTP 게시물에 보인다 정확한 것이지만 itemIdsBar입니다. 이 일을 바꿀 수 있도록 도와 주시겠습니까? 내 JS 모델에 이미 GUID 배열이 있으므로 요청 본문을 채우는 더 좋은 방법이 있습니까?

itemIds

컨트롤러에 하나의 문자열로 게시되고있다 : 여기

+0

'Guid'가 '문자열'로 건너 뛸 수 있다고 생각합니다. 그러면 'Guid'로 캐스팅됩니다. 이상한 이유로, 당신은 위에서와 같이 기본 MVC 매개 변수를 사용할 때 일반적으로 형식을 안전하게 형 변환하지 않습니다. – Greg

+0

그건 나를 슬프게합니다. 매개 변수를 Guid [] 대신 문자열로 변경하면 백 슬래시, 대괄호 및 쉼표가 포함 된 단일 문자열이 만들어 지므로 더 나쁩니다. 더 우아한 방법의 아이디어 - 하나 이상의 문자열 배열이나 목록보다는 하나의 문자열을 얻을 수있는 적어도 하나? –

+0

기본 Json 객체를 만든 다음 전달할 수 있습니다. 하나의 비 직렬화로 미친 인코딩을 피할 수 있습니다.'{Id = ''}'객체 유형, Id 속성을 가진 기본 객체. 분명히 유효한 Json이 도움이 될 것입니다. – Greg

답변

2

정말 무슨 일이 일어나고있다. 왜? itemIds은 배열로 해석되지 않기 때문에. 배열을 원하면 itemIds[0], itemsIds[1] 등의 숨겨진 값이 여러 개 있어야합니다. 내가 말하는 것은 실제로 무슨 일이 일어나고 있는지를 증명하는 간단한 테스트입니다.

다음과 같은 형식을 만듭니다.

<form method="post" action="/Foo/Bar"> 
    <input name="itemIdsOld" type="hidden" value="[&quot;f8b21933-419c-4bdd-b5b6-75295ff65612&quot;,&quot;67bb1d75-ae78-49e4-bc29-ee82a51bb9a1&quot;]"> 
    <input name="itemIds[0]" type="hidden" value="f8b21933-419c-4bdd-b5b6-75295ff65612"> 
    <input name="itemIds[1]" type="hidden" value="67bb1d75-ae78-49e4-bc29-ee82a51bb9a1"> 
    <button type="submit">Submit</button> 
</form> 

이 같은 컨트롤러를 만들기 : 위의 양식을 게시 할 때

[System.Web.Mvc.HttpPost] 
public ActionResult Index(string[] itemIdsOld, Guid[] itemIds) 
{ 
    return null; 
} 

, 당신은 것을 알 우리는 하나 개의 숨겨진 itemIdsOld 이름 값 다음 itemIds[0]itemIds[1]라는 이름이 개 더 숨겨진 가치를 창출 참조 하나의 문자열이 itemIdsOld에 생성되고 두 개의 GUID가 string으로 표시됩니다. 그러나 우리가 itemIds[0]itemIds[1]이라는 컨트롤을 만든 이후 두 번째 것은 Guid[] itemIds으로 예상대로 변환됩니다.

나는 각도에서이 작업을 수행하는 방법을 잘 모르겠지만, C# 및 면도기와 함께, 한 가지 방법은 같은 것 할 : 나는 하드 GUID를 코딩

@using System.Collections.Generic 
@{ 
    var guids = new List<Guid> { Guid.NewGuid(), Guid.NewGuid() }; 
} 
<form method="post" action="/Test/Index"> 
    <input name="itemIdsOld" type="hidden" value="[&quot;f8b21933-419c-4bdd-b5b6-75295ff65612&quot;,&quot;67bb1d75-ae78-49e4-bc29-ee82a51bb9a1&quot;]"> 
    @{ 
     for (int i = 0; i < guids.Count; i++) 
     { 
      <input name="itemIds[@i]" type="hidden" value="@guids[i]"> 
     } 
    } 
    <button type="submit">Submit</button> 
</form> 

하지만 당신은에서이를 얻을 수 있습니다 모델 ... 당신은 요점을 얻습니다.


또는 양식 제출을 가로 채기 위해 자바 스크립트를 사용 itemIds에서 값을 검색하고 배열로 전원을 켜고 컨트롤러에이를 제출할 수 있습니다, 그 역시 작동합니다.

+0

예. Angular와 함께 ng-repeat를 사용하면 감사 할 수 있습니다. 이것이 가장 좋은 방법 일 수 있습니다. POST를 수행하고 숨겨진 양식 필드를 철저히 쓰는 대신 JSON 본문 만 제공한다고 생각할 수있는 방법이 있습니까? –

+0

숨겨진 양식 필드를 거치지 않고 JSON 본문이 의미하는 바를 모르겠다. – CodingYoshi

+0

마치 Rube Goldberg 머신처럼 AngularJS를 통해 숨겨진 양식 필드를 설정하여 POST를 수행 할 수 있도록 자바 스크립트 코드 상태에서 필요한 모든 데이터가있을 때 POST 할 수 있습니다. 이것이 AJAX 인 경우 AJAX 요청을 작성하여 완료 하겠지만 Javascript 코드에서 AJAX POST가 아닌 요청을 작성할 수있는 방법은 없습니다. –