2016-06-23 2 views
0

내 코드에서 양식 게시시 중첩 된 개체 값을 읽을 수 없습니다. 하나의 오브젝트에서 목록 속성을 편집 할 수mvc 면도기 중첩 된 foreach 모델 post null subobject

Wrog 방법은 :

코드 :

@using AI.Business.Models 
@model Operazione 
@{ ViewBag.Title = "Simulatore"; } 
@using (Html.BeginForm("CreaOperazione", "Operativita", FormMethod.Post)) 
{  
// Imposto gli Hidden per tutte le proprietà che devo recuperare al post 
@Html.HiddenFor(x => x.RapportoModel.TipoRapportoId) 

<table width="100%" class="display" id="Simulatore" cellspacing="0"> 

    <thead> 
    <tr> 
     <th class="dt-head-left">Linea</th> 
     <th>AUM</th> 
    </tr> 
    </thead> 
    <tbody> 
     @Html.EditorFor(x => x.Movimenti) 
    </tbody> 

</table> 
<button id="btnSalva" name="btnSalva" type="submit" style="float: right;">Salva Operazione</button> 

}

@{ 
     var contatore = 0; 

     foreach (var item in Model.Movimenti) 
     { 
      var movimento = item; 

      <tr> 
       <td align="left"> 
        @*Imposto gli Hidden per tutte le proprietà che devo recuperare al post*@ 
        @Html.HiddenFor(x => movimento.Prodotto.Descrizione, "Movimenti[" + contatore + "].Prodotto.Descrizione") 

        @Html.DisplayFor(x => movimento.Prodotto.Descrizione, "Movimenti[" + contatore + "].Prodotto.Descrizione") 
       </td> 
       <td>@Html.EditorFor(x => movimento.Aum, "CurrencyDisabled", "Movimenti[" + contatore + "].AUM")</td> 
      </tr> 
      contatore++; 
     } 
    } 

이 하나의 객체에서 목록 속성을 편집 할 수있는 올바른 방법입니다

편집기를 사용하여 assuggested :

@model AI.Business.Models.Movimento 
<tr> 
<td align="left"> 
@Html.HiddenFor(x => x.Prodotto.Descrizione) 
@Html.DisplayFor(x => x.Prodotto.Descrizione)</td> 
<td>@Html.EditorFor(x => x.Aum, "CurrencyDisabled")</td> 

그리고 이것은 내 객체입니다

public class Movimento 
{ 
    public int Id { get; set; } 
    public ProdottoModel Prodotto { get; set; } 
    public decimal Aum { get; set; } 
} 

그리고 개체 제품명 : 내 Actionresult 속성 Descrizione에서

public class ProdottoModel 
{  
    [Key] 
    public int ID { get; set; } 
    public string Descrizione { get; set; } 
} 

가 null :

[HttpPost] 
    public ActionResult CreaOperazione(Operazione operazione) 
    { 
     if (ModelState.IsValid) 
     { 
      // Do something 
     } 
     else 
      ImpostaErrore(ModelState); 

     return View("PaginaSimulatore", operazione); 
    } 

를 열고 이미지 :
At my first access to the page the property Prodotto.Descrizione is populated

When i raise the form post event this property was sent with a null value

+0

양식 게시에서 올바르게 AUM 속성을 읽을 수 있지만 Prodotto.Descrizione 속성은 읽을 수 없습니다. –

+1

컬렉션의 양식 컨트롤을 생성하는 데 'foreach' 루프를 사용할 수 없습니다. [이 답변] (http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943#30094943)을 참조하십시오.) –

+0

그리고'NullReference' 예외를 얻는다면'Prodotto'가'null'이기 때문에 –

답변

1

나는 당신이 일이 중 하나를 얻고있는 방법을 잘 모르겠어요,하지만 총 우연입니다. 예를 들어, HiddenFor에는 필드의 이름 값을 지정하는 매개 변수가 없습니다. 대신 매개 변수는 실제로 익명 개체 또는 IDictionary을 필요로하는 htmlAttributes에 대한 매개 변수입니다. 오류가 발생하지 않는 유일한 이유는 string이 기술적으로 object이므로이 컨텍스트에서는 아무 것도 처리하지 않기 때문입니다.

나머지 도우미 호출도 마찬가지입니다. 특히 EditorFor을 사용하면 "CurrencyDisabled"을 전달하는 두 번째 매개 변수는 사용할 편집기 템플릿을 지정하기위한 것이고 세 번째 매개 변수는 additionalViewData을위한 것이며이 매개 변수는 편집기 템플릿의 컨텍스트 내에서 ViewData에 항목을 추가합니다.

길고 짧음, 생각지도 못한 방식입니다. 간단하고 간단하게 컬렉션으로 작업해야하는 경우 foreach 대신 for을 사용해야합니다. 도우미의 *For 패밀리에 전달하는 표현은 단지 속성을 식별하는 것만은 아니지만 얻을 수는 있습니다. 그것은 바인딩 가능 표현식이어야합니다. 즉, Razor가 양식 필드의 이름을 작성하는 데 사용할 수있는 표현식입니다.이 양식 필드는 게시 할 때 모델에 맞춰 정렬됩니다. 그렇게하기 위해서는, 이름이 Movimenti[N].Prodotto.Descrizione 같은, 그리고를 얻을 수있는 유일한 방법이어야처럼 도우미를 호출하는 것입니다 : ifor 루프에서 반복자 것

@Html.HiddenFor(m => m.Movimenti[i].Prodotto.Descrizione) 

.