폼 요소가 동적 인 번호를 가진 ASP.NET MVC를 사용하여 폼을 생성한다고합시다.ASP.NET MVC에서 동적으로 생성 된 양식의 출력을 어떻게 처리합니까?
예를 들어 각 제품에 대한 확인란이 필요하며 제품 수가 날마다 변경됩니다.
컨트롤러에 다시 게시되는 양식 데이터를 어떻게 처리합니까? 얼마나 많은 양식 값이 되돌아 올지 알지 못하기 때문에 조치 메소드에 매개 변수를 설정할 수 없습니다.
폼 요소가 동적 인 번호를 가진 ASP.NET MVC를 사용하여 폼을 생성한다고합시다.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에서 얻을 수 있습니다.
다른 옵션 하나 : 모델 제출자를 작성하여 양식 제출을위한 사용자 정의 유형으로 목록을 변경하십시오.
데이터에 따라 더 이상 최신 버전에서는 불가능한 'CheckboxList'를 출력하고 string[]
매개 변수를 사용하거나 여러 양식을 설정하고 작업을 수정할 수 있습니다.
크레이그의 답변에 따르면 더욱 안전합니다. 동일한 이름을 가진 여러 양식 요소를 게시하는 경우가 있습니다. WebForms와 비슷한 방식으로 컨트롤의 "컬렉션"을 만드는 논리를 래핑하는 것이 현명 할 것이라고 덧붙입니다. Web Forms은 컨테이너 컨트롤의 이름 앞에 추가되고 인덱스를 추가합니다. 예를 들어 Repeater에서 양식 요소의 이름은 RepeaterName_Element1, RepeaterName_Element2와 같습니다. 요소를 가져 오려면 FindControl이나 다른 것을 사용해야합니다.
사용하는 바인더에 따라이 작업을해야합니다 :이 같은 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를 사용하고 있습니다. 둘 다 이런 식으로 행동합니다. 나는 베타에서 바인딩이 같은 방식으로 작동합니다 짐작하고 있습니다.