2011-07-07 53 views
1

好的,这应该是一个问题,需要帮助让我的表单正常工作。在创建要发布的示例的过程中,我找出了修复的内容。ModelBinding选择列表和选定项目的枚举值

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

的例子invloves通过在从查询字符串绑定视图模型一个枚举属性设置在下拉列表中选择的值(这是probaly更清楚我在说什么样,如果你刚才读的代码):

控制器/型号

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的模型在的情况下完全相同。那么下拉选择值在一种情况下如何正确呈现,而不是其他情况?

回答

0

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

模型绑定器知道请求的类型是TestEnum。 1可以转换为狗。 dropwdownlist将ValueProviderResult的值转换为字符串。 1以字符串形式转换为“1”。选择列表中没有值为“1”的条目。

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