Asp.net mvc 如何在后期视图中使用DropDownListFor为多个元素设置默认值?
我有一个具有可枚举属性的ViewModel,该属性将通过页面上的多个下拉控件进行设置 My ViewModel有一个集合,可用于可能的选项,返回值为SelectedItems,默认值为PreSelectedItemsAsp.net mvc 如何在后期视图中使用DropDownListFor为多个元素设置默认值?,asp.net-mvc,Asp.net Mvc,我有一个具有可枚举属性的ViewModel,该属性将通过页面上的多个下拉控件进行设置 My ViewModel有一个集合,可用于可能的选项,返回值为SelectedItems,默认值为PreSelectedItems public class ViewModel { public ViewModel() { AvailableItems = new[] { new KeyValuePair<string, st
public class ViewModel
{
public ViewModel()
{
AvailableItems = new[]
{
new KeyValuePair<string, string>("", "unselected"),
new KeyValuePair<string, string>("key1", "value1"),
new KeyValuePair<string, string>("key2", "value2"),
new KeyValuePair<string, string>("key3", "value3"),
new KeyValuePair<string, string>("key4", "value4"),
};
}
public IEnumerable<KeyValuePair<string, string>> AvailableItems { get; set; }
public string[] SelectedItems { get; set; }
public string[] PreSelectedItems { get; set; }
}
最后,该视图显示下拉列表,其数量将根据其他参数而变化
for (var i = 0; i < 3; i++)
{
<p>
@Html.DropDownListFor(model => model.SelectedItems,
new SelectList(
Model.AvailableItems,
"Key",
"Value",
Model.PreSelectedItems[i]))
</p>
}
GET操作工作得非常好,中间的下拉列表显示“value4”
POST操作的viewModel参数已正确填充,但生成的视图显示没有预设/默认值的下拉列表。只要填充PreSelectedItems,返回原始ViewModel还是新创建的ViewModel并不重要,不会设置默认值
我不知道为什么它在GET上工作,但在相同的ViewModel上不工作。当您在请求后更改模型或模型中的任何值时,您必须清除模型状态,因为当您返回视图时,它会在模型之前检查模型状态,所以您应该这样做
[HttpPost]
public ActionResult Index(ViewModel viewModel)
{
var oldViewModel = new ViewModel
{
PreSelectedItems = new[] { "key3", null, null }
}
ModelState.Clear();
return View(oldViewModel);
}
您的意思是,当您将数据发送到HttpPost并返回模型时,旧的选定项不会更改?这是正确的,即使在ViewModel上设置了正确的属性,并且在调试视图时确认了这些属性,也不会在Post上设置与在GetModel上相同的默认值,不管您怎么想,您的GET也没有真正正确绑定,因为不是多个的东西不能绑定到IEnumerable,因此它需要您使用PreSelectedItems进行黑客攻击,您将永远无法得到任何验证。在POST metod中,不使用进一步的黑客操作的唯一方法是绑定到包含属性字符串SelectedItem的模型集合,并将3个对象传递到视图,其中SelectedItem的值在GET方法中设置,有关在循环中绑定dropwdownlists的更多信息,我知道GET没有绑定到该属性的显示,但是发布时,SelectedItems包含每个不同下拉列表选择的数组。原始ViewModel代码应为字符串[]SelectedItems,而不是IEnumerable。这不会对观察到的行为进行任何更改。请删除SelectedItems,然后进行检查
[HttpPost]
public ActionResult Index(ViewModel viewModel)
{
var oldViewModel = new ViewModel
{
PreSelectedItems = new[] { "key3", null, null }
}
ModelState.Clear();
return View(oldViewModel);
}