我是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
答案 0 :(得分:0)
因为当您重定向时,您正在传递更新的模型
return RedirectToAction("Index", tshirt);