Asp.net mvc 5 ASP.NET MVC Dropdownlist用于未选择正确的值

Asp.net mvc 5 ASP.NET MVC Dropdownlist用于未选择正确的值,asp.net-mvc-5,dropdownlistfor,Asp.net Mvc 5,Dropdownlistfor,我是ASP.NET框架的新手,我已经阅读了基础知识,对框架有了一些理解(理论),但在实践中并不多 我正在努力使用dropdownlistfor助手方法,当我试图以编程方式更改所选项目的值时,它会产生一种奇怪的行为 在我的控制器中,我有一个Index action方法,它接收一个Tshirt类型的参数,在这个action方法中,我将Tshirt对象的属性Color设置为2 在视图(强类型)中,我有一个颜色列表,并将此列表作为ColorViewModel类构造函数的参数传递,该类将负责为我的颜色列表

我是ASP.NET框架的新手,我已经阅读了基础知识,对框架有了一些理解(理论),但在实践中并不多

我正在努力使用dropdownlistfor助手方法,当我试图以编程方式更改所选项目的值时,它会产生一种奇怪的行为

在我的控制器中,我有一个Index action方法,它接收一个Tshirt类型的参数,在这个action方法中,我将Tshirt对象的属性Color设置为2

在视图(强类型)中,我有一个颜色列表,并将此列表作为ColorViewModel类构造函数的参数传递,该类将负责为我的颜色列表返回SelectListItems

在视图中,我使用model.Color中的值设置了ColorViewModel对象的Selected属性,现在我已经设置了所有属性,以便在调用

@Html.DropDownListFor(x => x.Color, cvm.SelectItems, "Select a color")
我将与所选项目一起显示我的下拉列表

当执行请求(GET)时,页面由浏览器呈现,dropdownlist(下拉列表)显示正确的值,该值是使用Index action方法中的值2建立的,下拉列表显示“蓝色”,这是正确的

然后,如果我在dropdownlist中选择一个不同的项目(红色,id为1)并提交表单,则会调用Save action方法,并且我知道模型正在使用model.Color=1到达action方法,这是正确的

然后我决定重定向到传递模型对象的index action方法,index action方法将Color属性更改回2,因此当呈现页面时,它应该在下拉列表中再次显示蓝色值,但没有,它显示红色

如果在Save action方法中注释掉以下行,则会得到不同的行为

//tshirt.Color = 3;
我知道我遵循的这个逻辑从商业逻辑的角度看没有多大意义,我只是试图理解我做错了什么,没有得到预期的结果。 给定以下模型

public class Color
{
    public int Id { get; set; }
    public string Description { get; set; }
}
我创建以下视图模型

public class ColorViewModel
{
    public int Selected { get; set; }
    private List<Color> Colors;
    public IEnumerable<SelectListItem> SelectItems { get { return new SelectList(this.Colors, "Id", "Description", this.Selected); } }
    private ColorViewModel() { }
    public ColorViewModel(List<Color> colors)
    {
        this.Colors = colors;
    }
}
最后是我的看法

    @{
        List<Color> colors = new List<Color>(){
            new Color(){Id=1, Description="Red"},
            new Color(){Id=2, Description="Blue"},
            new Color(){Id=3, Description="Green"}
        };
        ColorViewModel cvm = new ColorViewModel(colors) { Selected = Model.Color };
    }

    @using(@Html.BeginForm("Save","Home")){
        @Html.DropDownListFor(x => x.Color, cvm.SelectItems, "Select a color")
            <input type="submit" />
    }
@{
列表颜色=新列表(){
新颜色(){Id=1,Description=“Red”},
新颜色(){Id=2,Description=“Blue”},
新颜色(){Id=3,Description=“Green”}
};
ColorViewModel cvm=新的ColorViewModel(colors){Selected=Model.Color};
}
@使用(@Html.BeginForm(“保存”、“主页”)){
@Html.DropDownListFor(x=>x.Color,cvm.SelectItems,“选择颜色”)
}

我已经上传了完整的代码:

,因为当您重定向时,您正在传递更新的模型

return RedirectToAction("Index", tshirt);

是的,更新的模型正在被传递,但一旦在Index action方法中,值被更改为另一个值,dropdownlist不会显示此编程选择的项目,它会显示用户单击的项目。您可以发布您的Tshirt类和其他必要的代码,以便我们可以在我们这边进行尝试吗
return RedirectToAction("Index", tshirt);