2011-03-23 1 views
3

상당히 간단하지만 모델 바인딩에 문제가있는 것을 얻으려고합니다.Dictionary <Enum, string>()은 mvc의 모델에 바인딩하지 않습니다.

public class PageViewModel { 
     public IDictionary<ColumnType, string> Columns { get; set; } 
} 

다음 내보기 같은 모습입니다 : 다음과 같이

public enum ColumnType 
     { 
      Column1 = 1, 
      Column2 = 2, 
      Column3 = 3, 
      Column4 = 4, 
      Column5 = 5, 
      Column6 = 6, 
      Column7 = 7, 
      Column8 = 8, 
      Column9 = 9 
     } 

는 또한 내 뷰 모델에서 I 형 사전의 때에 프로퍼티가

<tr> 
    <% foreach (var value in Enum.GetValues(typeof(ColumnType))) 
     { 
      %> 
       <%: Html.TextBox(String.Format("Columns[ColumnType.{0}]", value.ToString()))%> 
      <% 
     } 
    %> 
    </tr> 

그리고 난 다음에 위의 게시 POST 방법 :

[POST] 
public ActionResult Index(PageViewModel viewModel) 
{ 
    var isNull = viewModel.Columns; //The model won't bind and 'isNull' is 'null' in here 
    ... 
    ... 
} 

보시다시피, 'viewModel.Columns'속성은 POST 액션에서 null입니다.

무엇이 여기에 있습니까? 결과에 대해

, 그것은 다음과 같이한다 :

// pseudocode 
Columns[0] = Key=Column1, Value="text1Value"; 
Columns[1] = Key=Column2, Value="text2Value"; 
... 

내가보기 내부 Columns[0].Key = Column1; Column[0].Value = "text1Value" 같은이 있어야 알고,하지만 난 모르겠어요.

미리 감사드립니다.

답변

2

이 같은 시도 답장을 보내

<% using (Html.BeginForm()) { %> 
    <% for (var i = 0; i < Model.Columns.Count; i++) { %> 
     <%= Html.Hidden("Columns[" + i + "].Key", Model.Columns.ElementAt(i).Key) %> 
     <%= Html.TextBox("Columns[" + i + "].Value", Model.Columns.ElementAt(i).Value) %> 
    <% } %> 
    <input type="submit" value="OK" /> 
<% } %> 
+0

머리에 손톱이 맞았습니다! 그게 효과가 있었어! 대단히 감사합니다 !!! – Gurdeep

0

물론 초기화하지 않았기 때문에 null이됩니다.

PageViewModel에 생성자를 작성하고 new 키워드로 인스턴스화하고 해당 값으로 열을 채 웁니다.

PageViewModel model = new PageViewModel(); 

은 비록, 나는 형식 당신이 당신의 질문의 끝 부분에 설명 된 것과 일치하지 않는 출력에 원하기 때문에 당신은 충분히 당신의 질문을 설명하지 않았다 생각합니다.

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new PageViewModel 
     { 
      Columns = Enum.GetValues(typeof(ColumnType)).Cast<ColumnType>().ToDictionary(x => x, x => x.ToString()) 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(PageViewModel model) 
    { 
     return View(); 
    } 
} 

및 뷰 :

+0

감사합니다! 하지만 GET 메서드에서 이미 '초기화'부분을 수행하고 있습니다. 나는 여기서 그것이 이해된다는 것을 언급하는 것을 피했다. 출력에 대해서는 단지 의사 코드 일뿐입니다. 친절하게 한 번 더 사물을 연결하려고합니다. 다시 한번 감사드립니다. – Gurdeep