2012-05-16 2 views
2

Привет У меня есть модель объекта определена в 3 проекта MVC, который имеет свойство словаря следующим образом:ASP.Net MVC 3 Словарь Binding

MyObj.ObjDictionary<string,string> 

У меня есть два метода контроллера, один из которых обрабатывает возвращающиеся вид и другой, который обрабатывает публикуемую форму с точки зрения

public ActionResult Scanner(string val_1, string val_2, string val_3) 
{ 
//Fetch sessionObj from Model 
MyObj sessionObj = getSessionObj(val_1, val_2, val_3); 

//At this point model.ObjDictionary<string,string> contains data 
return View(sessionObj); 
} 

[HttpParamAction] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Scanner(MyObj model) 
{ 
    //At this point model.ObjDictionary<string,string> is null 
    //i.e. binding is not being properly achieved 

    //Validate POSTed data 
} 

в представлении я итерацию по каждой пары ключ-значение (КВП). Это нужно сделать так, потому что свойство является динамическим, и я не знаю, сколько значений словаря будет.

@using (Html.BeginForm("Action", "Home")) 
{ 
    @foreach (var kvp in Model.ObjDictionary) 
    { 
      <span>@Html.Label("Scan " + @kvp.Key)</span> 
      <span>@Html.TextBox(kvp.Key, "", new { @style = "font-size:Medium;width:400px;" })</span> 
    } 
    <input type="submit" name="Cancel" value="Cancel" /> 
    <input type="submit" id="Scanner" name="Scanner" value="Scanner" /> 
} 

Целью является предоставление пользователям возможности вводить данные и привязывать эти данные к значениям конкретного ключа. Моя проблема в том, что Model.ObjDictionary имеет значение null, когда он получает POSTED. Я не уверен, что я делаю неправильно, я читаю статью this, но это предполагает наличие ранее существующих значений в словаре. Есть ли способ, которым ModelBinder может привязывать данные, введенные пользователем, к значению словаря, сопоставленному определенному ключу?

ответ

3

В статье вы ссылка отвечает на ваш вопрос, вам просто нужно обеспечить правильные имена для элементов управления, попробуйте:


@using (Html.BeginForm("Action", "Home")) { 
    var i = 0; 
    foreach (var kvp in Model.ObjDictionary) 
    { 
     @Html.Hidden("ObjDictionary[" + i + "].Key", kvp.Key)@kvp.Key 
     <span>@Html.TextBox("ObjDictionary[" + i + "].Value", kvp.Value, new { @style = "font-size:Medium;width:400px;" })</span> 
     i++; 
     <br /> 
    } 

    <input type="submit" value="Submit" /> 
} 
0

Для словарей, каждый элемент должен иметь одно поле для ключа и одно поля для стоимость.

@using (Html.BeginForm("Action", "Home")) 
{ 
    var index = 0; 
    @foreach (var kvp in Model.ObjDictionary) 
    { 
     <span>@Html.Hidden("ObjDictionary[" + index + "].Key", kvp.Key) 
     <span>@Html.Label("Scan " + @kvp.Key)</span> 
     <span>@Html.TextBox("ObjDictionary[" + index + "].Value", kvp.Value, new { @style = "font-size:Medium;width:400px;" })</span> 
     index++; 
    } 
    <input type="submit" name="Cancel" value="Cancel" /> 
    <input type="submit" id="Scanner" name="Scanner" value="Scanner" /> 
} 

Кстати, я инкапсулированные эту функциональность в HTML helper class. Вы можете найти его и рабочую демонстрацию здесь: https://github.com/ErikSchierboom/aspnetmvcdictionaryserialization