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