【问题标题】:Hidden input for Dictionary<string, string> in ASP.NET MVC 3ASP.NET MVC 3 中 Dictionary<string, string> 的隐藏输入
【发布时间】:2012-07-07 14:45:03
【问题描述】:

我需要在 Post 操作中获取我的模型属性,因此需要为它们隐藏元素,但我遇到了 Dictionary &lt;string, string&gt; 类型的问题。这是我的模特:

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 始终为空,为什么?我的错在哪里?有没有更好的方法将变量从视图传递到操作?

【问题讨论】:

  • Post 动作是什么样子的,它接收到像 public ActionResult Something(ViewPart viewPart) 这样的 Flags 模型吗?
  • @Garrett Fogerlie 我更新问题

标签: asp.net-mvc asp.net-mvc-3 dictionary hidden-field


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    将您的帖子操作更改为此

    [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 一起使用,如果不行,您可能需要像以前那样写出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多