更改页面时如何从下拉列表中保留所选值?
How to keep the selected value from the dropdown when the page is changed?
我正在用 C#(使用 mvc)开发一个项目,我不得不在我的视图中制作一个下拉过滤器,只有两个选择:Yes
和 No
。
这是填充下拉列表的代码:
服务方式:
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" })
数据库table列中的值是:"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
。
我调试发现controller中的方法的参数cancelled
的值是null
,到第二页的时候
如何在页面更改时保留下拉列表中选中的值?
您的代码正在生成 <option>
个元素,其值为 "1"
和 "NULL"
。文本 "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" })
其中第三个参数创建具有 null
值的 labelOption。
附带说明一下,如果您的字段只能存储 2 个值,那么您应该使用数据库 BIT
字段,这样 属性 就是
public bool IsCancelled { get; set; }
不是int? cancelled
(或者是string cancelled
?)
并简单地使用
@Html.CheckBoxFor(m => m.IsCancelled)
在视图中。我还建议您始终使用强类型 ***For()
方法。
我正在用 C#(使用 mvc)开发一个项目,我不得不在我的视图中制作一个下拉过滤器,只有两个选择:Yes
和 No
。
这是填充下拉列表的代码:
服务方式:
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" })
数据库table列中的值是:"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
。
我调试发现controller中的方法的参数cancelled
的值是null
,到第二页的时候
如何在页面更改时保留下拉列表中选中的值?
您的代码正在生成 <option>
个元素,其值为 "1"
和 "NULL"
。文本 "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" })
其中第三个参数创建具有 null
值的 labelOption。
附带说明一下,如果您的字段只能存储 2 个值,那么您应该使用数据库 BIT
字段,这样 属性 就是
public bool IsCancelled { get; set; }
不是int? cancelled
(或者是string cancelled
?)
并简单地使用
@Html.CheckBoxFor(m => m.IsCancelled)
在视图中。我还建议您始终使用强类型 ***For()
方法。