Asp.net mvc 如何在后期视图中使用DropDownListFor为多个元素设置默认值?

Asp.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

我有一个具有可枚举属性的ViewModel,该属性将通过页面上的多个下拉控件进行设置

My ViewModel有一个集合,可用于可能的选项,返回值为SelectedItems,默认值为PreSelectedItems

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);
     }