3

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

谢谢。

4

2 回答 2

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 源代码才能找到答案。

于 2012-09-08T14:25:02.913 回答
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; }
}
于 2012-05-25T11:11:58.847 回答