选择列表和所选项的ModelBinding枚举值

时间:2011-07-07 14:07:28

标签: asp.net-mvc-3 enums query-string selectlist model-binding

好的,这应该是一个问题,需要帮助让我的表单正常工作。在创建发布示例的过程中,我弄清楚修复的内容。

所以现在它成了一个问题,为什么它以一种方式而不是另一种方式工作。我真的无法理解这种行为。我在MVC中发现了一个错误吗?或者有什么我不明白的html请求,这使得这种行为正确吗?

示例invloves通过查询模型中的enum属性在下拉列表中设置所选值,该视图模型是从查询字符串绑定的(如果您只是阅读代码,我可能会更清楚我所说的):

控制器/型号

public class HomeController : Controller
{
    public ActionResult Index(TestModel model)
    {
        return View(model);
    }
}

public class TestModel
{
    public SelectList EnumOptions { get; set; }
    public TestEnum EnumValue { get; set; }

    public TestModel()
    {
        var options =  from Enum e in Enum.GetValues(typeof(TestEnum))
                         select new { Value = e, Name = e.ToString() };

        EnumOptions = new SelectList(options, "Value", "Name", TestEnum.NotSet);
    }
}

public enum TestEnum
{
    NotSet = 0,
    Dog = 1,
    Cat = 2
} 

查看

@Html.DropDownListFor(m => m.EnumValue, Model.EnumOptions)

<a href="?EnumValue=Dog">Dog numeric</a>
<a href="?EnumValue=1">Dog string</a>

这一切都很简单。

问题是,为什么第二个“狗”链接不能正常工作?请注意,它将enumValue作为数字属性提交,而不是作为“字符串”属性。

但模型绑定器没有问题。 提供给View的模型在两种情况下完全相同。那么下拉选择值如何在一种情况下正确呈现而不是另一种呢?

1 个答案:

答案 0 :(得分:0)

DropDownListFor查看modelstatedictionary以获取字段/属性的当前值。 第二个链接的ValueProviderResult的值为1.

modelbinder知道请求的类型是TestEnum。 A 1可以转换为Dog。 dropwdownlist将ValueProviderResult的值转换为字符串。 A 1作为字符串转换为“1”。选择列表中没有值为“1”的条目。

因此,下拉列表的当前值错误。