ASP.NET MVC에서 동적으로 생성 된 양식의 출력을 어떻게 처리합니까?

StackOverflow https://stackoverflow.com/questions/223149

  •  03-07-2019
  •  | 
  •  

문제

동적 수의 양식 요소가있는 ASP.NET MVC를 사용하여 양식을 작성한다고 가정 해 봅시다.

예를 들어, 각 제품에 대한 확인란이 필요하며 제품 수는 매일 변경됩니다.

컨트롤러에 다시 게시되는 양식 데이터를 어떻게 처리 하시겠습니까? 액션 메소드에서 매개 변수를 설정할 수 없습니다. 얼마나 많은 양식 값이 돌아올 지 모르기 때문입니다.

도움이 되었습니까?

해결책

각 확인란 만 고유 한 이름 값을 제공합니다.

<input class="approveCheck" id="<%= "approveCheck" + recordId %>" 
 name="<%= "approveCheck" + recordId %>" type="checkbox" />

그런 다음 제출 후 조치에서 양식 값 목록을 구문 분석합니다.

foreach (var key in Request.Form.Keys)
    {
        string keyString = key.ToString();
        if (keyString.StartsWith("approveCheck", StringComparison.OrdinalIgnoreCase))
        {
            string recNum = keyString.Substring(12, keyString.Length - 12);

            string approvedKey = Request.Form["approveCheck" + recNum];
            bool approved = !String.IsNullOrEmpty(approvedKey);
            // ...

양식 값을 인수로 전달할 필요는 없습니다. request.form에서 얻을 수 있습니다.

다른 옵션 중 하나 : 모델 바인더를 작성하여 양식 제출을 위해 목록을 사용자 정의 유형으로 변경하십시오.

다른 팁

크레이그의 대답에 따라 .. 더 안전합니다. 동일한 이름의 여러 양식 요소를 게시하는 데 어려움이 있습니다. 나는 컨트롤의 "컬렉션"을 WebForms와 유사한 방식으로 만드는 논리를 포장하는 것이 현명하다고 덧붙였다. 웹 양식은 컨테이너 컨트롤의 이름을 전제하고 인덱스를 추가합니다. 예를 들어, 리피터에서 내부의 양식 요소는 (와 같은) RepeaTname_Element1, RepeaTname_element2라는 이름을 지정합니다. 요소를 꺼내려고하면 FindControl 또는 종류의 것을 사용해야합니다.

사용중인 바인더에 따라 작동해야합니다.

<%var i = 0;
  foreach (var product (IList<ProductSelection>)ViewData["products"]) {%>
      <%=Html.Hidden(string.Format("products[{0}].Id", i), product.Id)%>
      <%=Html.Checkbox(string.Format("products[{0}].Selected", i))%>
      <%=product.Name%><br/>
<%}%>

... 이로 인해 HTML이 다음과 같은 것을 초래할 것입니다 (이름의 배열 표기법을 알아 차립니다) :

<input name="products[0].Id" type="hidden" value="123">
<input name="products[0].Selected" type="checkbox">
Widget
<input name="products[1].Id" type="hidden" value="987">
<input name="products[1].Selected" type="checkbox">
Gadget

... 그리고 게시물을 처리하는 컨트롤러 방법 :

public ActionResult SelectProducts(IList<ProductSelection> products)
{
     ...
}

바인딩시, 제품 매개 변수에는 두 가지 인스턴스의 제품 선택이 포함됩니다.

한 가지주의 사항은 복잡한 객체에 새로운 기본 바인딩을 사용하지 않았다는 것입니다. 오히려 나는 MVCContrib의 NameValuedeserializer 또는 Castlebind를 사용하고 있습니다. 그들은 둘 다 이런 식으로 행동합니다. 베타의 바인딩이 같은 방식으로 작동한다고 생각합니다.

데이터에 따라 'CheckBoxList'를 출력 할 수 있습니다 (더 이상 최신 버전에서는 불가능함)을 사용할 수 있습니다. string[] 매개 변수 또는 여러 양식을 설정하고 동작을 수정할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top