asp.net core mvc中的Html.DropDownList中怎样设置选中项

怎样设置集合中,每一个实例的选中项
1.后台代码

 public IActionResult Privacy()
 {
     var lstInhibit = new List<Animal>()
     {
         new Animal()
         {
          InhibitId=1,
          InhibitName="y1",              
         },
         new Animal()
         {
          InhibitId=2,
          InhibitName="y2",          
         }
     }; // 获取经过条件筛选的集合

     var viewModel = new AnimalViewModel
     {
       
         lstAnimalViewModel=new List<AnimalViewModel>()
         {
             new AnimalViewModel
             { 
                 SelectedInhibitId=1,
                 Animal =new Animal()
                 {
                       DisplayName="ccc",
                       InhibitId=1,
                      InhibitName="y1",
                 }
               
             },
              new AnimalViewModel
             {
                 SelectedInhibitId=2,
                 Animal =new Animal()
                 {
                      DisplayName="ccc",
                      InhibitId=2,
                      InhibitName="y2",
                 }
             },
         },
        
         AvailableInhibits = lstInhibit
         .Select(item => new SelectListItem
         {
             Value = item.InhibitId.ToString(),
             Text = item.InhibitName
         })
         .ToList()
     };

     return View(viewModel);           
 }



  public async Task<IActionResult> UpdateAnimal(AnimalViewModel viewModel)
  {
      Task.Delay(10);
      int selectedInhibitId = viewModel.SelectedInhibitId;
      return View("Home");
  }

  

前台 代码

@{
    ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>

<p>Use this page to detail your site's privacy policy.</p>

@model WebApplication3.AnimalViewModel
<form asp-controller="Home" asp-action="UpdateAnimal" id="main" method="post" data-ajax="true" data-ajax-complete="completed" data-ajax-success="afterSuccess" data-ajax-failure="failed">
    @{
        // for(int i = 0 ; i < @Model.lstAnimalViewModel.Count; i++)
        // {
            @Html.DropDownListFor(model => model.SelectedInhibitId, Model.AvailableInhibits,@Model.lstAnimalViewModel[1].Animal.InhibitId)
            @Html.TextBoxFor(model=>model.lstAnimalViewModel[1].Animal.InhibitName)
            @Html.TextBoxFor(model=>model.lstAnimalViewModel[1].Animal.DisplayName)
            @Html.HiddenFor(model=>model.lstAnimalViewModel[1].Animal.InhibitId)
        // }
    }

    <input type="submit" value="Confirm" class="form-control btn-primary" style="font-size:20px;" />
</form>
  1. model层
 public class AnimalViewModel
   {
       public string DisplayName { get; set; }
       public int InhibitId { get; set; }
       public string InhibitName { get; set; }
       public int SelectedInhibitId { get; set; }
       public List<SelectListItem> AvailableInhibits { get; set; }
   }

   public class Animal
   {
       public string DisplayName { get; set; }
       public int InhibitId { get; set; }
       public string InhibitName { get; set; }
   }

看了你的代码,发现一些问题。从model的定义上来看的话,你似乎想要使用复合类型模型,那么你应该直接将Animal 作为AnimalViewModel的一个属性,像这样:

public class AnimalViewModel
    {
        public Animal Animal { get; set; }
        public int SelectedInhibitId { get; set; }
        public List<SelectListItem> AvailableInhibits { get; set; }
    }

在定义ViewMode的时候,看上去你想要定义一个集合,那就直接new一个list ,这个对象并不是 AnimalViewMode 类的属性。所以我猜在这里,你可能想做类似这样的事:

public IActionResult Privacy()
        {
            var lstInhibit = new List<Animal>() {
                new Animal() {
                    InhibitId=1,
                    InhibitName="y1",
                },
                new Animal() {
                    InhibitId=2,
                    InhibitName="y2",
                }
            };
            // 获取经过条件筛选的集合

            var lstAnimalViewModel = new List<AnimalViewModel>()
            {
                new AnimalViewModel()
                {
                    Animal =new Animal()
                    {
                        DisplayName="ccc",
                        InhibitId=1,
                        InhibitName="y1",
                    },
                    SelectedInhibitId=1,
                    AvailableInhibits = lstInhibit.Select(item => new SelectListItem
                    {
                        Value = item.InhibitId.ToString(),
                        Text = item.InhibitName
                    }).ToList()

                },
                new AnimalViewModel()
                {
                    Animal =new Animal()
                    {
                        DisplayName="ccc",
                        InhibitId=2,
                        InhibitName="y2",
                    },
                    SelectedInhibitId=2,
                    AvailableInhibits = lstInhibit.Select(item => new SelectListItem
                    {
                        Value = item.InhibitId.ToString(),
                        Text = item.InhibitName
                    }).ToList()
                }
            };

            return View(lstAnimalViewModel);
        }

@model List<CoreMvcSimple.Models.AnimalViewModel>
<form asp-controller="Home" asp-action="UpdateAnimal" id="main" method="post" data-ajax="true" data-ajax-complete="completed" data-ajax-success="afterSuccess" data-ajax-failure="failed">
    @{
         for(int i = 0 ; i < @Model.Count; i++)
         {
            @Html.DropDownListFor(model => model[i].SelectedInhibitId, Model[i].AvailableInhibits,Model[i].Animal.InhibitId)
            @Html.TextBoxFor(model=>model[i].Animal.InhibitName)
            @Html.TextBoxFor(model=>model[i].Animal.DisplayName)
            @Html.HiddenFor(model=>model[i].Animal.InhibitId)
            
         }
    }

    <input type="submit" value="Confirm" class="form-control btn-primary" style="font-size:20px;" />
</form>

引用 皆我百晓生 小程序回复内容作答:
在ASP.NET Core MVC中,要设置Html.DropDownList的选中项,可以通过在Model中的SelectedInhibitId属性设置选中项的值。在后台代码中,可以根据条件筛选出需要的选项列表,并设置每个实例的SelectedInhibitId属性表示该实例的选中项。在前台代码中,可以使用@Html.DropDownListFor方法来生成下拉列表,并将SelectedInhibitId属性作为参数传递给该方法,以设置选中项。以下是修改后的代码示例:

后台代码:

public IActionResult Privacy()
{
    var lstInhibit = new List<Animal>()
    {
        new Animal()
        {
            InhibitId=1,
            InhibitName="y1",              
        },
        new Animal()
        {
            InhibitId=2,
            InhibitName="y2",          
        }
    }; // 获取经过条件筛选的集合

    var viewModel = new AnimalViewModel
    {
        lstAnimalViewModel=new List<AnimalViewModel>()
        {
            new AnimalViewModel
            { 
                SelectedInhibitId=1,
                Animal =new Animal()
                {
                    DisplayName="ccc",
                    InhibitId=1,
                    InhibitName="y1",
                }
            },
            new AnimalViewModel
            {
                SelectedInhibitId=2,
                Animal =new Animal()
                {
                    DisplayName="ccc",
                    InhibitId=2,
                    InhibitName="y2",
                }
            },
        },
        AvailableInhibits = lstInhibit
        .Select(item => new SelectListItem
        {
            Value = item.InhibitId.ToString(),
            Text = item.InhibitName
        })
        .ToList()
    };

    return View(viewModel);
}

public async Task<IActionResult> UpdateAnimal(AnimalViewModel viewModel)
{
    Task.Delay(10);
    int selectedInhibitId = viewModel.SelectedInhibitId;
    return View("Home");
}

前台代码:

@model WebApplication3.AnimalViewModel

<form asp-controller="Home" asp-action="UpdateAnimal" id="main" method="post" data-ajax="true" data-ajax-complete="completed" data-ajax-success="afterSuccess" data-ajax-failure="failed">
    @for(int i = 0 ; i < Model.lstAnimalViewModel.Count; i++)
    {
        @Html.DropDownListFor(model => model.lstAnimalViewModel[i].SelectedInhibitId, Model.AvailableInhibits)
        @Html.TextBoxFor(model=>model.lstAnimalViewModel[i].Animal.InhibitName)
        @Html.TextBoxFor(model=>model.lstAnimalViewModel[i].Animal.DisplayName)
        @Html.HiddenFor(model=>model.lstAnimalViewModel[i].Animal.InhibitId)
    }

    <input type="submit" value="Confirm" class="form-control btn-primary" style="font-size:20px;" />
</form>

在上面的代码中,使用了for循环来遍历lstAnimalViewModel集合,并对每个元素生成下拉列表和文本框等控件。通过指定model => model.lstAnimalViewModel[i].SelectedInhibitId作为DropDownListFor方法的参数,可以将该实例的SelectedInhibitId属性与下拉列表关联起来,从而设置选中项。