如何在页面更改时保持下拉列表中的选定值

本文关键字:下拉列表 | 更新日期: 2023-09-27 18:14:51

我正在C#中处理一个项目(使用mvc(,我不得不在视图中制作一个下拉筛选器,只有两个选项:YesNo

以下是填充下拉列表的代码:

服务方式:

public List<SelectListItem> cancelledForDp()
{
    List<SelectListItem> cancelled = new List<SelectListItem>();
    var data = new[]
    {
        new SelectListItem { Value = "1",Text = "Yes" },
        new SelectListItem { Value = "NULL",Text = "No" }
    };
    cancelled = data.ToList();
    return cancelled;
}

控制器:

ViewBag.cancelledDp = utilService.cancelledForDp();

视图:

@Html.DropDownList("cancelled", (IEnumerable<SelectListItem>)ViewBag.cancelledDp, new { id = "chosenCancelled" })

数据库表中的列中的值为:"1"NULL(我的意思是与过滤器连接的值(。我的过滤器工作正常。

当我使用值No进行筛选时,会返回一些页面。当我转到与第一个不同的页面(2个或更多(时,下拉列表的值不会保留。它应该是No,但实际上是Yes

我在这里寻找与我的问题相关的答案,但没有找到合适的答案。

我猜问题与NULL值有关,所以我尝试了这个:

服务中:

public List<SelectListItem> cancelledForDp()
{
    List<SelectListItem> cancelled = new List<SelectListItem>();
    var data = new[]
    {
        new SelectListItem { Value = "1",Text = "Yes" },
        new SelectListItem { Value = "2",Text = "No" }
    };
    cancelled = data.ToList();
    return cancelled;
}

控制器:

if(cancelled == 2)
{
    cancelled = null;
}

但我得到了同样的结果。当我在过滤器中选择No并转到第二页时,下拉列表中的Yes而不是No

当我转到第二页时,我调试发现控制器中方法的参数cancelled的值是null

更改页面时,如何保持下拉列表中的选定值

如何在页面更改时保持下拉列表中的选定值

您的代码正在生成值为"1""NULL"<option>元素。文本"NULL"null的值不同(由空字符串识别,即没有值(。如果属性cancelled的值是null,则将选择第一个选项,因为不存在具有空值的选项元素(并且因为必须选择某些内容(

为了选择它,您的元素需要是<option value="">No</option>,您可以使用生成

public IEnumerable<SelectListItem> cancelledForDp()
{
    return new List<SelectListItem>()
    {
        new SelectListItem { Value = "1",Text = "Yes" },
        new SelectListItem { Value = "",Text = "No" }
    };
}

public IEnumerable<SelectListItem> cancelledForDp()
{
    return new List<SelectListItem>()
    {
        new SelectListItem { Value = "1", Text = "Yes" },
    };
}

并且在视图中使用

@Html.DropDownList("cancelled", (IEnumerable<SelectListItem>)ViewBag.cancelledDp, "No", new { id = "chosenCancelled" })

其中第三个参数创建具有CCD_ 22值的labelOption。

附带说明一下,如果您的字段只能存储2个值,那么您应该将BIT字段用作数据库,以便属性为

public bool IsCancelled { get; set; }

不是int? cancelled(还是string cancelled?(

并简单地使用

@Html.CheckBoxFor(m => m.IsCancelled)

在视图中。我还建议您始终使用强类型的***For()方法。