【问题标题】:Form field values aren't binding to model表单字段值未绑定到模型
【发布时间】:2012-10-10 20:04:17
【问题描述】:

我创建了一个简单的 MVC 应用程序,它从表单中获取信息并将其传递给控制器​​

查看:

@model MvcApplication1.Models.BetChargeModel


@using (Html.BeginForm())
{
<div>
    @Html.TextBoxFor(m=>m.numerators[0])   /   @Html.TextBoxFor(m=>m.denominators[0])
</div>

<div>
    @Html.TextBoxFor(m => m.numerators[1])   /   @Html.TextBoxFor(m => m.denominators[1])
</div>

<div>
    <input type="submit" value="Calculate" />
</div>
}

控制器:

 public ActionResult Index()
    {
        BetChargeModel model = new BetChargeModel();
        model.numerators = new List<double>();
        model.denominators = new List<double>();
        model.denominators.Add(1);
        model.denominators.Add(1);
        model.numerators.Add(0);
        model.numerators.Add(0);

        return View(model);
    }

[HttpPost]
    public ActionResult Index(BetChargeModel model)
    {
        double odds1 = model.numerators[0] / model.denominators[0];
        double odds = model.numerators[1] / model.denominators[1];

//other code
}

型号:

 public class BetChargeModel
{
    public List<double> numerators { get; set; }

    public List<double> denominators { get; set; }

    public double result { get; set; }

}

当我运行它并尝试从视图中回发信息时,模型返回为空(充满空字段和零)。为什么我的 Textbox 中的数据没有绑定到模型?

(编辑:我已经更改了模型属性和对分子、分母和结果的引用,但为了简洁起见,这里没有更新)

【问题讨论】:

  • 试试你的示例代码,HttpPost Action 中的模型完美绑定...分子和分母列表已正确填充!
  • @RaphaëlAlthaus 我认为该模型是使用字段而不是属性实现的,导致出现问题。

标签: asp.net-mvc-3


【解决方案1】:

根据名称 numeratorsdenominators,您似乎已将列表实现为模型上的字段。

您应该use properties instead 以使模型绑定正常工作(我假设@Raphael 已经做到了)。

工作模型如下所示:

public class BetChargeModel
{
    public List<double> numerators { get; set; }
    public List<double> denominators { get; set; }
}

...并遵循命名约定,确保将 numerators 重命名为 Numeratorsdenominators 重命名为 Denominators

但是,如果这不能解决您的模型绑定问题,请详细说明并发布您的模型实现:)

-- 更新

正如您报告的问题仍然存在,我将根据您自己提供的示例发布我实现的代码 - 然后您可以交叉检查以确保一切在您的机器上看起来正确 - 下面显示的代码已经过测试和作品:

型号:

public class BetChargeModel
{
    public List<double> numerators { get; set; }
    public List<double> denominators { get; set; }
}

查看:

@model Project.Models.BetChargeModel

@using (Html.BeginForm())
{
<div>
    @Html.TextBoxFor(m=>m.numerators[0])   /   @Html.TextBoxFor(m=>m.denominators[0])
</div>

<div>
    @Html.TextBoxFor(m => m.numerators[1])   /   @Html.TextBoxFor(m => m.denominators[1])
</div>

<div>
    <input type="submit" value="Calculate" />
</div>
}

控制器:

public ActionResult Index()
{
    var model = new BetChargeModel
                    {
                        numerators = new List<double> {0, 0},
                        denominators = new List<double> {1, 1}
                    };
    return View(model);
}

[HttpPost]
public ActionResult Index(BetChargeModel model)
{
    var odds1 = model.numerators[0] / model.denominators[0];
    var odds = model.numerators[1] / model.denominators[1];
    return null;
}

【讨论】:

  • 你假设得很好,我错过了这种可能性!
  • @Lasse 你是对的。我确实在模型中放置了字段而不是属性。我现在已经更新了它,但我仍然收到原来的错误,所以我已经按照你的要求发布了我的模型
  • @Sperick 我现在已经添加了我的示例代码 - 我已经在 ASP.NET MVC4 应用程序中对其进行了测试,并且模型绑定按预期工作:)
  • @Sperick 顺便说一句,在您更改模型后,您是否记得重新编译您的解决方案? :)
  • @Lasse 是的,我重新编译了。我已经复制了您的控制器代码并使用它而不是我的,但结果仍然相同。我会详细说明。我在 HttpPost 方法的第一行收到“ArgumentOutOfRange”异常。当我运行调试器时,我看到分子和分母的计数都为零。所以列表都存在,但我在视图中插入到文本框中的数字没有被输入到它们中。
猜你喜欢
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 2019-01-03
  • 1970-01-01
  • 2018-06-30
  • 2013-02-08
相关资源
最近更新 更多