【问题标题】:MVC3 - Cannot select item in DropDownListForMVC3 - 无法在 DropDownListFor 中选择项目
【发布时间】:2014-08-14 19:59:16
【问题描述】:

我正在尝试学习 MVC3,在我正在做的一项练习中,我定义了一个 DropDownListFor,如下所示:

@Html.DropDownListFor(m => m.Animal,
new System.Web.Mvc.SelectList(Model.AvailableValues, "Value",
"Text", Model.Animal))

其中 Model.Animal 的类型为 AnimalEnum:

public enum AnimalEnum
{
    Cat,
    Dog,
    Fox,
    Aardvark
}

而AvailableValues定义为:

var model = definition.Settings.GetModel<AnimalTypePart>();
model.AvailableValues = Enum.GetValues(typeof (AnimalEnum))
            .Cast<int>()
            .Select(i => 
                new {
                    Text = Enum.GetName(typeof (AnimalEnum), i), 
                    Value = i
                });

我的问题是我能够正确保存我在下拉列表中选择的值,但是当我再次显示下拉列表时,它不会显示保存的值,而是始终显示列表的第一个(猫)。我还尝试将“(int)Model.Animal”作为 DropDownListFor 的最后一个参数,它对应于每个选项关联的整数 Value,但它也不起作用。调试 我可以确认调用助手时 DropDownListFor 的所有参数都具有正确的值。 当我可视化页面时,您能帮我让下拉列表自动显示保存的值吗?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-3 html.dropdownlistfor


    【解决方案1】:

    您必须将索引作为所选参数中的值传递,因为您使用 Enum 项的索引作为选择中的值:

    var model = definition.Settings.GetModel<AnimalTypePart>();
    model.AvailableValues = Enum.GetValues(typeof (AnimalEnum))
            .Cast<int>()
            .Select(i => 
                new {
                    Text = Enum.GetName(typeof (AnimalEnum), i), 
                    Value = i,
                    Selected = i == (int)model.Animal
                });
    

    同样,DropDownListFor 的最后一个参数是htmlAttributes,你传递的是Model.Animal,删除它。

    【讨论】:

    • 不幸的是它不起作用。 AvailableValues 是一个 IEnumerable,因此通过您的代码,我获得了一个列表,其中每个元素本身都有 selected 属性。而Model.Animal是SelectList的最后一个参数,不是DropDownListFor的:msdn.microsoft.com/en-us/library/dd492553(v=vs.118).aspx
    【解决方案2】:

    您需要定义一个属性来保存模型中的选定值

    此属性还需要存在于可用选项中可供选择的值列表中。

    这样你的模型会自动重新绑定到选定的值,如果它是在模型中设置的,并且还会在帖子中保存选定的值。

    这是一个如何做到这一点的示例。

    Working example

    型号

    public class MyViewModel
    {
        public string SelectedAnimalId { get; set; }
        public IEnumerable<SelectListItem> AvailableValues { get; set; }
    
    }
    

    请注意SelectedAnimalId 属性,它将保存选定的字符串值。这是枚举的转换后的 int 属性,即 cat = 0、dog = 1 等,保存在所选列表项的值中。

    控制器

        [HttpGet]
        public ActionResult Index()
        {
            var model = new MyViewModel();          
    
            model.AvailableValues = PopulatedDropDown;
            model.SelectedAnimalId = "1";
    
            return View(model);
        }
    
    
        [HttpPost]
        public ActionResult Index(MyViewModel model)
        {
            // Save it to db and rebind the selected
            model.AvailableValues = PopulatedDropDown;  
    
    
            return View(model);
        }
    
        // helper property to populate from the enum
        private IEnumerable<SelectListItem> PopulatedDropDown
        {           
                get {
                    var enumList =  Enum.GetValues(typeof (AnimalEnum))
                .Cast<int>()
                .Select(i => 
                        new SelectListItem {
                        Text = Enum.GetName(typeof (AnimalEnum), i), 
                        Value = i.ToString()
    
                    });
                    return enumList;
                }
        }
    

    在获取可用选项列表中填充了SelectedAnimalId 设置为列表中的第二个。请注意工作示例中的重新绑定。

    帖子只是简单地传递模型并显示在视图中选择了哪个项目。

    查看

    @using (Html.BeginForm())
     {  
    @Html.DropDownListFor(m => m.SelectedAnimalId,
    Model.AvailableValues)
        <input type="submit" class="btn btn-primary" value="Submit" />
    }
                    Selected Item:
                    @Model.SelectedAnimalId
    

    上面只是将SelectedAnimalId设置为第一个参数,然后使用绑定列表作为选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多