将下拉列表与值而非键进行比较

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 ;