2010-12-05 4 views
6

컨트롤러 동작 메서드가 Dictionary<string, double?>을보기로 전달합니다. 나는 내보기에 다음과 같은 한 : 나는 텍스트 상자에 어떤 값을 입력하고 공격 할 때사전 바인딩 모델

[HttpPost] 
public virtual ActionResult MyMethod(Dictionary<string, double?> items) 
{ 
    // do stuff........ 
    return View(); 
} 

하는 버튼에게 POST 액션을 제출 : 아래

<% foreach (var item in Model.Items) { %> 
<%: Html.Label(item.Key, item.Key)%> 
<%: Html.TextBox(item.Key, item.Value)%> 
<% } %> 

는 POST 작업을 처리하는 내 행동 방법 메소드가 항목을 다시 얻지 못하고 있습니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

9

사전에 바인딩 할 수 있도록 입력란의 이름을 지정하는 방법에 대해 this blog post을 읽는 것이 좋습니다.

<input type="hidden" name="items[0].Key" value="key1" /> 
<input type="text" name="items[0].Value" value="15.4" /> 
<input type="hidden" name="items[1].Key" value="key2" /> 
<input type="text" name="items[1].Value" value="17.8" /> 

라인을 따라 뭔가를 생성 할 수있다 : 그래서 당신은 키에 대한 추가 숨겨진 필드가 필요합니다 말했다되고

<% var index = 0; %> 
<% foreach (var key in Model.Keys) { %> 
    <%: Html.Hidden("items[" + index + "].Key", key) %> 
    <%: Html.TextBox("items[" + index +"].Value", Model[key]) %> 
    <% index++; %> 
<% } %> 

, 개인적으로 나는 당신이 사전을 사용하지 않는 것이 좋습니다 당신의 조회수. 그것들은 추악하고 모델 바인더에 적절한 이름을 생성하기 위해 추한 코드를 작성해야합니다. 나는 뷰 모델을 사용할 것이다.

모델 :

public class MyViewModel 
{ 
    public string Key { get; set; } 
    public double? Value { get; set; } 
} 

컨트롤러 :

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new[] 
     { 
      new MyViewModel { Key = "key1", Value = 15.4 }, 
      new MyViewModel { Key = "key2", Value = 16.1 }, 
      new MyViewModel { Key = "key3", Value = 20 }, 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(IEnumerable<MyViewModel> items) 
    { 
     return View(items); 
    } 
} 

보기 (~/Views/Home/Index.aspx) :

<% using (Html.BeginForm()) { %> 
    <%: Html.EditorForModel() %> 
    <input type="submit" value="OK" /> 
<% } %> 

편집기 템플릿 (~/Views/Home/EditorTemplates/MyViewModel.ascx) :

다음은 예입니다