6

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

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

public class ViewPart {
 ...
 public Dictionary<string, string> Flags { get; set; }
}

我的控制器:

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);

在视图中:

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

我也试试这个:

@foreach(var item in Model.ViewPart.Flags) { 
  @Html.HiddenFor(modelItem => item)
}

更新 发布操作:

[HttpPost]
public ActionResult MyPostAction(ViewModel model){
  //model.ViewPart.Flags is null
}

但是在 Post 操作Flags中始终为空,为什么?我的错在哪里?有没有更好的方法将变量从视图传递到操作?

4

2 回答 2

7

如果要模型绑定到字典,则需要两个隐藏字段,一个用于 the Key,一个用于 the :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"/>

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

或者,如果您不想运行,可以使用附加隐藏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"/>
}

您可以在这两篇文章中找到很多关于模型绑定与集合的信息:

于 2012-07-07T11:08:26.810 回答
0

将您的发布操作更改为此

[HttpPost]
public ActionResult MyPostAction(ViewModel model, ViewPart viewPart)
{
    model.ViewPart.Flags = viewPart.Flags;
}

并在视图中使用

@foreach(var item in Model.ViewPart.Flags) { 
  @Html.HiddenFor(modelItem => item)
}

如果这不起作用,请检查呈现的 HTML 的源并查看是否呈现了隐藏信息。我不确定是否@Html.HiddenFor可以使用Dictionary您可能需要像以前那样写出来,如果没有的话。

于 2012-07-07T10:52:40.497 回答