ASP.NET MVC DropDownList不选择正确的值

时间:2014-06-06 00:19:52

标签: asp.net-mvc-5 dropdownlistfor

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

我正在努力使用dropperlist for helper方法,当我尝试以编程方式更改所选项的值时,它会产生一种奇怪的行为。

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

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

在视图中我然后使用来自model.Color的值设置我的ColorViewModel对象的Selected属性,现在我设置了所有内容,以便在我调用时

@Html.DropDownListFor(x => x.Color, cvm.SelectItems, "Select a color")

我将显示所选项目的下拉列表。

当执行请求(GET)时,浏览器呈现页面,并且下拉列表显示选择的正确值,该值在Index操作方法中使用值2建立,下拉列表显示“Blue”这是正确的。

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

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

如果您在“保存”操作方法中注释掉以下行,您将获得不同的行为。

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

这是我的控制器

public class HomeController : Controller
{
    [HttpGet()]
    public ActionResult Index(Tshirt tshirt)
    {
        tshirt.Color = 2;
        Tshirt t = new Tshirt();
        t.Color = tshirt.Color;            
        return View(t);
    }
    [HttpPost()]
    public ActionResult Save(Tshirt tshirt)
    {
        //tshirt.Color = 3;
        return RedirectToAction("Index", tshirt);
        //return View("Index",tshirt);
    }
}

最后我的观点

    @{
        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" />
    }

我上传了完整的代码:VS Solution

1 个答案:

答案 0 :(得分:0)

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

return RedirectToAction("Index", tshirt);