如果Dictionary键可以为十进制,则Mvc SelectList不会绑定

时间:2012-05-25 10:36:26

标签: c# .net asp.net-mvc asp.net-mvc-3 razor

为什么我的下拉列表没有约束力?使用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);
        }
    }

感谢。

2 个答案:

答案 0 :(得分:3)

<强>更新

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

这是事情开始变得奇怪的地方。如果我为字典键使用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源代码以找出答案。

答案 1 :(得分:1)

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

控制器:

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