2008-10-21 3 views
4

폼 요소가 동적 인 번호를 가진 ASP.NET MVC를 사용하여 폼을 생성한다고합시다.ASP.NET MVC에서 동적으로 생성 된 양식의 출력을 어떻게 처리합니까?

예를 들어 각 제품에 대한 확인란이 필요하며 제품 수가 날마다 변경됩니다.

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

답변

5

그냥 각각의 체크 박스에 고유 한 이름 값 제공 :

<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에서 얻을 수 있습니다.

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

0

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

2

크레이그의 답변에 따르면 더욱 안전합니다. 동일한 이름을 가진 여러 양식 요소를 게시하는 경우가 있습니다. WebForms와 비슷한 방식으로 컨트롤의 "컬렉션"을 만드는 논리를 래핑하는 것이 현명 할 것이라고 덧붙입니다. Web Forms은 컨테이너 컨트롤의 이름 앞에 추가되고 인덱스를 추가합니다. 예를 들어 Repeater에서 양식 요소의 이름은 RepeaterName_Element1, RepeaterName_Element2와 같습니다. 요소를 가져 오려면 FindControl이나 다른 것을 사용해야합니다.

2

사용하는 바인더에 따라이 작업을해야합니다 :이 같은 HTML 뭔가가 발생합니다

<%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/> 
<%}%> 

이 ... (이름에 배열 표기법을 확인할 수) :

<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) 
{ 
    ... 
} 

을 제품 paramet er에는 ProductSelection의 두 인스턴스가 포함됩니다.

하나의 경고는 복잡한 개체에 대한 새로운 기본 바인딩을 사용하지 않았다는 것입니다. 오히려 나는 MvcContrib에서 NameValueDeserializer 또는 CastleBind를 사용하고 있습니다. 둘 다 이런 식으로 행동합니다. 나는 베타에서 바인딩이 같은 방식으로 작동합니다 짐작하고 있습니다.