将下拉列表与值而非键进行比较
Compare dropdown with value not key
我正在模型中获取用户数据并使用 SelectList,使用名称和 ID 获取国家详细信息。
ID Name
1 USA
2 UK
3 CANADA
在我的页面上,我有文本框,其中我显示了从模型中获取的国家名称美国。现在我也想在我的下拉列表中选择相同的国家/地区名称。
var GetNewCountry = new SelectList(_manualGridService.GetCountry().OrderBy(l => l.Name)
.ToDictionary(us => us.ID, us => us.Name), "Key", "Value");
ViewBag.GetNewCountry = GetNewCountry ;
这是我的视图下拉代码
<div class="form-group">
<select asp-for="ConId" asp-items="@ViewBag.GetNewCountry" class="form-control">
<option value=""> Select </option>
</select>
<span asp-validation-for="ConId" class="text-danger"></span>
</div>
参数详情
public int ConId { get; set; }
这是我的带有参数的文本框代码
public string UserConName{ get; set; }
<div class="form-group">
<input asp-for="UserConName" class="form-control" readonly="readonly" autocomplete="off" placeholder="Country Name" style="width:107%" />
</div>
UserConName,文本框包含值 USA,我想保留在 USA 中我的下拉列表也是。
我的解决方案
string strId = "";
foreach (var item in GetNewCountry )
{
if (item.Text == res.ConName)
{
strId = item.Value;
}
}
if (!string.IsNullOrEmpty(strId))
{
res.ConId= int.Parse(strId);
}
缩短答案
var GetNewCountry = new List<SelectListItem>();
foreach (var item in _manualGridService.GetCountry().OrderBy(l => l.Name).ToDictionary(us => us.ID, us => us.Name))
{
GetNewCountry.Add(new SelectListItem() {
Value = item.Key.ToString(),
Text = item.Value,
Selected = item.Value == "USA" ? true : false
});
}
ViewBag.GetNewCountry = GetNewCountry ;
详细解释
首先你要知道,使用new SelectList(_manualGridService.GetCountry().OrderBy(l => l.Name) .ToDictionary(us => us.ID, us => us.Name), "Key", "Value")
,Key
等于Id
的值,Value
等于Name
的值。
然后对比这个构造函数定义:public SelectList(IEnumerable items, string dataValueField, string dataTextField)
,我们可以知道ID
代表了<option>
的值,'Name'代表<option>
的文本.
<option value="IDValue">NameValue</option>
最后 SelectList
包含另一个可以设置下拉列表 selected 值的构造函数:
public SelectList(IEnumerable items, string dataValueField, string dataTextField, object selectedValue)
最重要的是,在您的场景中,selected 值与 ID
不匹配,它与 Name
值匹配,因此您需要像下面这样更改 SelectList
:
var GetNewCountry = new SelectList(_manualGridService.GetCountry().OrderBy(l => l.Name)
.ToDictionary(us => us.ID, us => us.Name), "Value", "Value","USA");
生成html:
<select class="form-control" data-val="true" data-val-required="The ConId field is required." id="ConId" name="ConId">
<option value=""> Select </option>
<option selected="selected" value="NameValue1">NameValue1</option>
<option value="NameValue2">NameValue2</option>
//...
</select>
注:
通过这种方式你可以获得value="USA"
选项selected,但另一个问题,你的select <select asp-for="ConId">
这里绑定的值是ConId
,但是option的值现在是Name
,所以表单提交是绑定不成功的。
所以如果您不想将 <select asp-for="ConId">
更改为<select asp-for="UserConName">
,您需要像下面这样修改您的后端代码:
var GetNewCountry = new List<SelectListItem>();
foreach (var item in _manualGridService.GetCountry().OrderBy(l => l.Name).ToDictionary(us => us.ID, us => us.Name))
{
GetNewCountry.Add(new SelectListItem() { Value = item.Key.ToString(), Text = item.Value, Selected = item.Value == "USA" ? true : false });
}
ViewBag.GetNewCountry = GetNewCountry ;
我正在模型中获取用户数据并使用 SelectList,使用名称和 ID 获取国家详细信息。
ID Name
1 USA
2 UK
3 CANADA
在我的页面上,我有文本框,其中我显示了从模型中获取的国家名称美国。现在我也想在我的下拉列表中选择相同的国家/地区名称。
var GetNewCountry = new SelectList(_manualGridService.GetCountry().OrderBy(l => l.Name)
.ToDictionary(us => us.ID, us => us.Name), "Key", "Value");
ViewBag.GetNewCountry = GetNewCountry ;
这是我的视图下拉代码
<div class="form-group">
<select asp-for="ConId" asp-items="@ViewBag.GetNewCountry" class="form-control">
<option value=""> Select </option>
</select>
<span asp-validation-for="ConId" class="text-danger"></span>
</div>
参数详情
public int ConId { get; set; }
这是我的带有参数的文本框代码
public string UserConName{ get; set; }
<div class="form-group">
<input asp-for="UserConName" class="form-control" readonly="readonly" autocomplete="off" placeholder="Country Name" style="width:107%" />
</div>
UserConName,文本框包含值 USA,我想保留在 USA 中我的下拉列表也是。
我的解决方案
string strId = "";
foreach (var item in GetNewCountry )
{
if (item.Text == res.ConName)
{
strId = item.Value;
}
}
if (!string.IsNullOrEmpty(strId))
{
res.ConId= int.Parse(strId);
}
缩短答案
var GetNewCountry = new List<SelectListItem>();
foreach (var item in _manualGridService.GetCountry().OrderBy(l => l.Name).ToDictionary(us => us.ID, us => us.Name))
{
GetNewCountry.Add(new SelectListItem() {
Value = item.Key.ToString(),
Text = item.Value,
Selected = item.Value == "USA" ? true : false
});
}
ViewBag.GetNewCountry = GetNewCountry ;
详细解释
首先你要知道,使用new SelectList(_manualGridService.GetCountry().OrderBy(l => l.Name) .ToDictionary(us => us.ID, us => us.Name), "Key", "Value")
,Key
等于Id
的值,Value
等于Name
的值。
然后对比这个构造函数定义:public SelectList(IEnumerable items, string dataValueField, string dataTextField)
,我们可以知道ID
代表了<option>
的值,'Name'代表<option>
的文本.
<option value="IDValue">NameValue</option>
最后 SelectList
包含另一个可以设置下拉列表 selected 值的构造函数:
public SelectList(IEnumerable items, string dataValueField, string dataTextField, object selectedValue)
最重要的是,在您的场景中,selected 值与 ID
不匹配,它与 Name
值匹配,因此您需要像下面这样更改 SelectList
:
var GetNewCountry = new SelectList(_manualGridService.GetCountry().OrderBy(l => l.Name)
.ToDictionary(us => us.ID, us => us.Name), "Value", "Value","USA");
生成html:
<select class="form-control" data-val="true" data-val-required="The ConId field is required." id="ConId" name="ConId">
<option value=""> Select </option>
<option selected="selected" value="NameValue1">NameValue1</option>
<option value="NameValue2">NameValue2</option>
//...
</select>
注:
通过这种方式你可以获得value="USA"
选项selected,但另一个问题,你的select <select asp-for="ConId">
这里绑定的值是ConId
,但是option的值现在是Name
,所以表单提交是绑定不成功的。
所以如果您不想将 <select asp-for="ConId">
更改为<select asp-for="UserConName">
,您需要像下面这样修改您的后端代码:
var GetNewCountry = new List<SelectListItem>();
foreach (var item in _manualGridService.GetCountry().OrderBy(l => l.Name).ToDictionary(us => us.ID, us => us.Name))
{
GetNewCountry.Add(new SelectListItem() { Value = item.Key.ToString(), Text = item.Value, Selected = item.Value == "USA" ? true : false });
}
ViewBag.GetNewCountry = GetNewCountry ;