C# MVC3-无法在DropDownList for中选择项

C# MVC3-无法在DropDownList for中选择项,c#,asp.net,asp.net-mvc,asp.net-mvc-3,html.dropdownlistfor,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Html.dropdownlistfor,我正在尝试学习MVC3,在我正在做的一个练习中,我定义了一个DropDownList,如下所示: @Html.DropDownListFor(m => m.Animal, new System.Web.Mvc.SelectList(Model.AvailableValues, "Value", "Text", Model.Animal)) 其中,模型动物为动物型: public enum AnimalEnum { Cat, Dog, Fox, Aardva

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

@Html.DropDownListFor(m => m.Animal,
new System.Web.Mvc.SelectList(Model.AvailableValues, "Value",
"Text", Model.Animal))
其中,模型动物为动物型:

public enum AnimalEnum
{
    Cat,
    Dog,
    Fox,
    Aardvark
}
可用价值定义为:

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
                });
我的问题是,我能够正确保存我在下拉列表上选择的值,但当我再次显示下拉列表时,它不会显示保存的值,而是始终显示列表中的第一个值。我还尝试将intModel.Animal作为DropDownListFor的最后一个参数,该参数对应于与每个选项关联的整数值,但它也不起作用。调试我可以在调用帮助程序时确认DropDownListFor的所有参数都具有正确的值。
当我可视化页面时,您能帮助我让dropdownlist自动显示保存的值吗?

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

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中保留选定值

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

模型

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

post只是简单地传递模型,并显示视图中已选择的项目

看法


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

不幸的是,它不起作用。AvailableValues是一个IEnumerable,因此通过您的代码,我获得了一个列表,其中每个元素本身都有selected属性。和Model.Animal是SelectList的最后一个参数,而不是DropDownListFor的最后一个参数:
public class MyViewModel
{
    public string SelectedAnimalId { get; set; }
    public IEnumerable<SelectListItem> AvailableValues { get; set; }

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