【问题标题】:C# MVC Html.CheckBoxFor not binding to modelC# MVC Html.CheckBoxFor 未绑定到模型
【发布时间】:2015-03-20 18:16:42
【问题描述】:

我遇到了一个令人沮丧的问题,当我发回控制器时,我似乎无法让模型绑定与 CheckBoxFor 一起使用。我的模型只是返回 null。任何帮助将不胜感激!

查看

@model IEnumerable<FFR.Context.Matchup>

@{
Layout = null;
}

<!DOCTYPE html>

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>View1</title>
</head>
<body>
<p>
    @Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm(Html.BeginForm("Submit", "Matchups", FormMethod.Post)))
{
    @foreach (var item in Model) {
    <tr>
        <td>@Html.CheckBoxFor(modelItem => item.isChecked)</td>

        <td>
            @Html.DisplayFor(modelItem => item.MatchupDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Spread)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.HomeScore)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.AwayScore)
        </td>
    }

    <tr><td><input type="submit" value="Submit" /></td></tr>

</table>
}
</body>
</html>

控制器

[HttpPost]
public ActionResult Submit(IEnumerable<Matchup> model)
{

        //processing

}

型号

public partial class Matchup
{
    public Matchup()
    {
        this.Bets = new HashSet<Bet>();
    }

    public int MatchupId { get; set; }
    public int HomeTeamId { get; set; }
    public int AwayTeamId { get; set; }
    public int LocationId { get; set; }
    public System.DateTime MatchupDate { get; set; }
    public int WeekId { get; set; }
    public int SeasonId { get; set; }
    public Nullable<decimal> Spread { get; set; }
    public Nullable<decimal> HomeScore { get; set; }
    public Nullable<decimal> AwayScore { get; set; }
    public string TimeLeft { get; set; }
    public Nullable<System.DateTime> LastUpdate { get; set; }
    public Boolean isChecked { get; set; }
}

【问题讨论】:

    标签: c# asp.net-mvc checkbox


    【解决方案1】:

    您需要使用for 循环,以便您的控件使用索引器正确命名。将模型更改为@model IList&lt;FFR.Context.Matchup&gt;,然后在视图中

    for(int i = 0; i < Model.Count; i++)
    {
      @Html.CheckBoxFor(m => m[i].isChecked)
      ....
    }
    

    如果您不能使用IList,那么您可以为您的模型使用自定义EditorTemplate (refer this example)

    旁注:为什么要使用Layout = null; 并在视图中呈现head(而不是指定布局)?

    【讨论】:

    • 这不会创建多个具有相同 ID 的复选框吗?这在 MVC 中实际上看起来很尴尬。
    • 不,如果您查看生成的 html,它将创建 &lt;input type="checkbox" id="_0__isChecked" name="[0].isChecked" ...&gt;&lt;input type="checkbox" id="_1__isChecked" name="[1].isChecked" ...&gt; 实际上它的 OP 的原始代码正在创建重复的 id 属性(和 name 属性,这就是为什么它不会绑定到回发的集合)。而且我看不出for 循环比foreach 循环更尴尬
    • @StephenMuecke 谢谢,这工作得很好。对于其他人,请注意这也需要我稍微更改表头的视图,因为我必须更改为 IList。 @Html.DisplayNameFor(model => model.MatchupDate) 变为 @Html.DisplayNameFor(model=> model[0].MatchupDate)
    • @robson。我怀疑如果模型没有项目会失败。 @DisplayNameFor() 具有接受 IEnumerable&lt;T&gt; 的重载,因此您可以使用 @DisplayNameFor(m=&gt; m.MatchupDate)(尽管智能感知在您构建之前会抱怨)。如果您的模型具有IEnumerable 的属性,您可以使用@Html.DisplayNameFor(m =&gt; m.MyCollection.FirstOrDefault().Name)answers suggested here
    • @StephenMuecke 不能使用 m => m.MatchupDate 因为我现在使用的是 IList 而不是 IEnmerable。但是 FirstOrDefault() 对我来说非常有效。我会说尽管 model=> model[0].MatchupDate 确实可以工作,即使没有引用 here 的项目,但是我使用 FirstOrDefault() 因为这似乎是最好的方法。再次感谢您。
    【解决方案2】:

    希望此链接能让您深入了解模型绑定如何与列表一起使用。 http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

    请注意,您在视图中执行的操作过多。尝试将编辑器模板用于更简单的视图。

    我还注意到 2 次调用 Begin 表单。你真的打算这样使用吗?

    【讨论】:

      猜你喜欢
      • 2017-11-17
      • 2014-04-10
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多