不能在下拉列表中选择项目

本文关键字:选择 项目 下拉列表 不能 | 更新日期: 2023-09-27 18:18:15

我正在尝试学习MVC3,在一个练习中,我正在做我已经定义了一个DropDownListFor像这样:

@Html.DropDownListFor(m => m.Animal,
new System.Web.Mvc.SelectList(Model.AvailableValues, "Value",
"Text", 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
                });

我的问题是,我能够正确地保存我在下拉列表中选择的值,但是当我再次显示下拉列表时,它不显示保存的值,而是总是显示列表(Cat)的第一个。我还试着输入"(int)Model"。Animal"作为DropDownListFor的最后一个参数,它对应于与每个选项关联的整数值,但它也不起作用。调试时,我可以确认当调用helper时,DropDownListFor的所有参数都具有正确的值。你能帮我有下拉列表自动显示保存值时,我可视化的页面?

不能在下拉列表中选择项目

如果要使用Enum项的索引作为select:

中的值,则必须将索引作为所选参数的值传递。
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,请删除它

您需要定义一个属性,该属性将在您的模型中保存选定值

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

这样,你的模型将自动重新绑定到选定的值,如果它在模型中被设置,并且在post中也保留选定的值。

下面是一个示例。

工作示例

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;
            }
    }

在get中填充可用选项列表,并将SelectedAnimalId设置为列表中的第二个选项。注意工作示例中的重新绑定。

post简单地传递模型并显示视图中已选中的项目。

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

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