HTML helper在提交表单时没有更新DropdownListFor
本文关键字:更新 DropdownListFor 表单 helper 提交 HTML | 更新日期: 2023-09-27 18:10:48
我有一个简单的HTML表单,将dropwonlistfor绑定到颜色,它下面有一个textBox和提交按钮来提交表单并保存颜色。
当我从下拉列表中选择一种颜色时,如果用户单击提交表单,它将改变它下面的文本框的值。它回到控制器,我保存颜色从文本框和返回视图(模型)作为一个动作的结果,但问题是,下拉列表没有得到更新的文本框的值,无论下拉列表内的文本框的值与否。
顺便说一下,你可以自己测试它有谁能帮忙吗?Model.cs
public class TestModel {
public String Color { get; set; }
}
Controller.cs
public ActionResult Index() {
var model = new TestModel();
model.Color="Blue";
ViewData["Colors"]=new List<SelectListItem>() { new SelectListItem() { Text = "Blue", Value = "Blue" }, new SelectListItem() { Text = "Red", Value = "Red" } };
return View(model);
}
[HttpPost]
public ActionResult Index(TestModel model) {
model.Color="Red";
ViewData["Colors"]=new List<SelectListItem>() { new SelectListItem() { Text = "Blue", Value = "Blue" }, new SelectListItem() { Text = "Red", Value = "Red" } };
return View(model);
}
Index.cs
@using (Html.BeginForm()) {
@Html.DropDownListFor(m => m.Color, ViewData["Colors"], new { @class = "w200" })
<input type="submit" />
}
模型
public class TestModel {
public String Color { get; set; }
public SelectList Colors {get;set;} }
控制器public ActionResult Index() {
var model = new TestModel();
model.Color="Blue";
var colors =new List<SelectListItem>() { new SelectListItem() { Text = "Blue", Value = "Blue" }, new SelectListItem() { Text = "Red", Value = "red" } };
model.Colors = new SelectList(colors,"Text","Value");
return View(model);
}
[HttpPost] public ActionResult Index(TestModel model) {
model.Color="Red";
var colors =new List<SelectListItem>() { new SelectListItem() { Text = "Blue", Value = "Blue" }, new SelectListItem() { Text = "Red", Value = "red" } };
model.Colors = new SelectList(colors,"Text","Value");
return View(model); }
<<p> 视图/strong> @using (Html.BeginForm()) {
<div>
@Html.DropDownListFor(m => m.Color, Model.Colors, new { @class = "w200" })
<input type="submit" />
</div>
}
好了,伙计们,问题不在于你实现这个场景的方式,这里的问题是ModelState。我POST到Action并返回相同的视图。第二次呈现视图时,它将查看ModelState并使用这些值来填充控件。因此,简单地说,我们需要在返回View之前清除ModelState。
Model.cs
public class TestModel {
public String Color { get; set; }
}
Controller.cs
public ActionResult Index() {
var model = new TestModel();
model.Color="Blue";
ViewData["Colors"]=new List<SelectListItem>() { new SelectListItem() { Text = "Blue", Value = "Blue" }, new SelectListItem() { Text = "Red", Value = "Red" } };
return View(model);
}
[HttpPost]
public ActionResult Index(TestModel model) {
model.Color="Red";
ViewData["Colors"]=new List<SelectListItem>() { new SelectListItem() { Text = "Blue", Value = "Blue" }, new SelectListItem() { Text = "Red", Value = "Red" } };
***ModelState.Clear();***
return View(model);
}
Index.cs
@using (Html.BeginForm()) {
@Html.DropDownListFor(m => m.Color, ViewData["Colors"], new { @class = "w200" })
<input type="submit" />
}
Cheeeeeers
你需要在你的Post动作中包含所有的颜色
也不要使用ViewData,而是将项目添加到视图模型:
public class TestModel {
public String Color { get; set; }
IEnumerable<SelectListItem> AvailableColors {get;set;}
}
但是由于视图模型是用来抽象你的模型的,你可以这样做:
public class TestModel {
public TestModel(IEnumerable<string> colors)
{
AvailableColors = colors.Select(c => new SelectListItem{Text=c, Value = c});
}
public String Color { get; set; }
IEnumerable<SelectListItem> AvailableColors {get;}
}
在你的控制器中:
public ActionResult Index() {
var model = new TestModel(new string[]{"Red", "Green", "Blue"});
model.Color="Blue";
return View(model);
}
为了使下拉列表改变选择的内容,您必须将与文本框值相对应的选择列表项的selected属性设置为true。像这样:(注意:我没有编译和测试这个。可能需要进行一些调整才能使其编译。此外,我认为如果一个颜色不在列表中,它应该被添加。
[HttpPost]
public ActionResult Index(TestModel model) {
model.Color="Red";
var colors = new List<SelectListItem>() { new SelectListItem() { Text = "Blue", Value = "Blue" }, new SelectListItem() { Text = "Red", Value = "Red" } };
SelectListItem selectedColor = colors.Where(c => c.Text == model.Color).FirstOrDefault();
if (selectedColor != null)
{
selectedColor.Selected = true;
}
else
{
colors.Add(new SelectListItem() { Text = model.Color; Value = model.Color; Selected = true; };
}
ViewData["Colors"] = colors;
return View(model);
}
编辑
在做了一些测试和挖掘之后,看起来你需要使用javascript来做到这一点,就像这个问题中解释的那样。另一个选择是滚动您自己的帮助器。