怎样设置集合中,每一个实例的选中项
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>
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属性与下拉列表关联起来,从而设置选中项。