1

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

我正在努力使用 dropdownlistfor 辅助方法,当我尝试以编程方式更改所选项目的值时,它归结为一种奇怪的行为。

在我的控制器中,我有接收 Tshirt 类型参数的 Index 操作方法,在此操作方法中,我将 Tshirt 对象的名为 Color 的属性设置为值为 2。

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

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

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

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

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

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

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

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

//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 解决方案

4

1 回答 1

0

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

return RedirectToAction("Index", tshirt);
于 2014-06-06T01:23:32.653 回答