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