ASP.NET MVC 3中Dictionary <string,string>的隐藏输入

5 asp.net-mvc dictionary hidden-field asp.net-mvc-3

我需要在Post动作中获取我的模型属性,因此需要为它们隐藏元素,但是我的类型有问题Dictionary <string, string>.这是我的模特:

public class ViewModel{
 ...
 public ViewPart ViewPart { get; set; }
}

public class ViewPart {
 ...
 public Dictionary<string, string> Flags { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和我的控制器:

Dictionary<string, string> flags = new Dictionary<string, string>();
flags.Add("kind", "Edit");
flags.Add("Command", "Save");
ViewModel model = new ViewModel(){ Flags  = flags };
return View(model);
Run Code Online (Sandbox Code Playgroud)

在视图中:

@foreach(var item in Model.ViewPart.Flags) { 
 <input type="hidden" id="ViewPart_Flags_@(item.Key)" value="@item.Value" name="ViewPart.Flags[@(item.Key)]" />
}
Run Code Online (Sandbox Code Playgroud)

我也尝试这个:

@foreach(var item in Model.ViewPart.Flags) { 
  @Html.HiddenFor(modelItem => item)
}
Run Code Online (Sandbox Code Playgroud)

更新 发布动作:

[HttpPost]
public ActionResult MyPostAction(ViewModel model){
  //model.ViewPart.Flags is null
}
Run Code Online (Sandbox Code Playgroud)

但在Post动作中,Flags总是为空,为什么?我的错在哪里?有没有更好的方法从View To Action传递变量?

nem*_*esv 6

您需要两个隐藏字段Key,一个用于,Value如果要模拟绑定到字典,则需要一个:

var index = 0;
foreach (var item in Model.ViewPart.Flags)
{

    <input type="hidden" value="@item.Key" 
                         name="ViewPart.Flags[@(index)].Key"/>
    <input type="hidden" value="@item.Value" 
                         name="ViewPart.Flags[@(index)].Value"/>

    index++;
}
    <input type="submit" value="Save"/>
Run Code Online (Sandbox Code Playgroud)

注意,您还需要一个运行索引来使模型绑定器满意.

或者,如果您不想运行,可以使用附加隐藏Index字段解决:

foreach (var item in Model.ViewPart.Flags)
{

    <input type="hidden" value="@item.Key" 
                         name="ViewPart.Flags.Index"/>
    <input type="hidden" value="@item.Key" 
                         name="ViewPart.Flags[@(item.Key)].Key" />
    <input type="hidden" value="@item.Value" 
                         name="ViewPart.Flags[@(item.Key)].Value" />
}
    <input type="submit" value="Save"/>
}
Run Code Online (Sandbox Code Playgroud)

在这两篇文章中,您可以找到有关使用集合进行模型绑定的大量信息: