MVC3 - 无法在DropDownListFor中选择项目

时间:2014-08-14 19:59:16

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

我正在尝试学习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的最后一个参数,它对应于与每个选项关联的整数值,但它也不起作用。调试我可以确认在调用帮助程序时DropDownListFor的所有参数都具有正确的值。 我可以帮助我让下拉列表在我可视化页面时自动显示保存的值吗?

2 个答案:

答案 0 :(得分:0)

您必须将索引作为值传递给选定的参数,前提是您使用枚举项的索引作为选择中的值:

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,删除它。

答案 1 :(得分:0)

您需要定义一个属性,以便在模型中保存选定值

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

这样,如果在模型中设置了模型并且在帖子中保留了选定的值,模型将自动重新绑定到选定的值。

以下是如何执行此操作的示例。

<强> Working example

<强>模型

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

}

请注意SelectedAnimalId属性,该属性将保存所选的值,即字符串。这是enum的转换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设置为第一个参数,然后使用绑定列表作为选项。