如果字典键为可为空的十进制,则 Mvc 选择列表不会绑定

本文关键字:选择 Mvc 列表 绑定 十进制 字典 如果 | 更新日期: 2023-09-27 18:35:15

为什么我的下拉列表没有绑定?使用 DropDownListFor Razor 帮助程序函数。

视图:

@Html.DropDownListFor(m => m.ModelObject.VatRate, Model.VatRatesList)

视图模型:

    public SelectList VatRatesList
    {
        get
        {
            return new SelectList(
                new Dictionary<decimal, string>
                {
                    { 0m, string.Empty },
                    { 1.2m, "20%" },
                    { 1m, "0%" }
                }, "Key", "Value",
                ModelObject.VatRate ?? 0m);
        }
    }

谢谢。

如果字典键为可为空的十进制,则 Mvc 选择列表不会绑定

更新

经过进一步调查,我发现这与我试图绑定的模型属性有关。它是一个可为空的小数。当我将其更改为小数时,从列表中选择了正确的值。

这就是事情开始变得奇怪的地方。如果我对字典键使用 4 位小数,它适用于可为空的十进制模型属性。换句话说,这有效:

 public SelectList VatRatesList
    {
        get
        {
            return new SelectList(
                new Dictionary<decimal, string>
                {
                    { 0.0000m, string.Empty },
                    { 1.2000m, "20%"},
                    { 1.0000m, "0%"}
                }, "Key", "Value");
        }
    }

我不知道为什么。也许 html 助手在内部使用 ToString()。我认为 ToString() 会给出十进制的 4dp 字符串表示。我必须查看MVC源代码才能找到答案。

确切的代码对我有用(看不到模型/视图的其余部分,因此很难确定问题)。这是我使用的代码:

控制器:

 public ActionResult Index()
 {
        var model = new Model();
        model.ModelObject = new ModelObject();
        model.ModelObject.VatRatesList = new SelectList(
            new Dictionary<decimal, string>
            {
                { 0m, string.Empty },
                { 1.2m, "20%" },
                { 1m, "0%" }
            }, "Key", "Value",
            model.ModelObject.VatRate ?? 0m);
        return View(model);
 }

视图:

@using (Html.BeginForm())
{
@Html.DropDownListFor(m => m.ModelObject.VatRate, Model.ModelObject.VatRatesList)
<input type="submit" value="Submit me"/>
}

控制器开机方法:

[HttpPost]
public ActionResult Index(Model model)
{
    //Breakpointing on the below line, I can see model.ModelObject.VatRate
    return RedirectToAction("Index");
}

我使用了这两个类:

public class Model
{
    public ModelObject ModelObject { get; set; }
}
public class ModelObject
{
    public decimal? VatRate { get; set; }
    public SelectList VatRatesList { get; set; }
}