在我的asp.net-mvc页面中,为什么没有选择正确的下拉列表?

我有一个asp.net-mvc网站,我遇到的问题是没有选择下拉列表中正确选择的项目.我的控制器操作上有以下代码(简化以隔离问题):

public ActionResult MyAction()
{
 var vm = GetVM();

 var list = new List<INamed> {new NamedInfo() {Id = 1,Name = "Yes"},new NamedInfo() {Id = 0,Name = "No"}};
 vm.YesNoList = SelectListHelper.GenerateDropdownList(vm.IncludesWeekends ? 1 : 0,list);

  return View(vm);
 }

这是GenerateDropdownList的定义

public static List<SelectListItem> GenerateDropdownList<T>(int id,IEnumerable<T> list) where T : INamed
    {
        List<SelectListItem> dropdown = list.Select(c => new SelectListItem
        {
            Selected = c.Id == id,Text = c.ToString(),Value = c.Id.ToString()
        }).ToList();

        return dropdown;
    }

以下是我的HTML视图中的代码

<% = Html.DropDownList("IncludesWeekends",Model.YesNoList,new { @id = "IncludesWeekends" })%>

我希望在我的示例中选择No(当我在服务器端放置一个断点时它有Selected = true但是当我查看生成的html时,没有选择任何内容

<select id="IncludesWeekends" class="autoComplete1" name="IncludesWeekends">
 <option value="1">Yes</option>
 <option value="0">No</option>
 </select>

认选择“是”,因为它是第一个项目.

关于我在这里做错了什么或者有效的替代方案的任何建议?

解决方法

SelectListItem中的Selected属性大多无用 (more about that in my answer here).在大多数情况下,HTML帮助程序将忽略它.相反,在您的情况下,他们将查看以下值:

> ModelState [“IncludesWeekends”]
> ViewData [“IncludesWeekends”]
> Model.IncludesWeekends

…并将它们找到的任何值转换为String,然后将其用作选定的值.

您的模型上有一个IncludesWeekends属性,因此它会:

Model.IncludesWeekends.ToString()

… …从你的代码判断 – 将导致真“或”假“(因为它是一个布尔).

在您的情况下,您使用c.Id.ToString()作为<选项>您的下拉列表的值,并且由于帮助程序在这些值(“1”/“0”)中找不到其选择的字符串(“True”/“False”),因此它不会选择任何内容.

方法围绕它:

>(最简单的方法):接受使用“True”和“False”作为<选项>值而不是整数ID.
>(几乎同样容易但不是非常干净的方式):将ViewData [“IncludesWeekends”]设置为您想要选择的值(即Id).这是有效的,因为帮助器会在Model.IncludesWeekends之前查看它.
>使用视图模型,其中包含IncludesWeekendsId属性,然后使用它来生成下拉列表,而不是IncludesWeekends:

<%= Html.DropDownList(“IncludesWeekendsId”,Model.YesNoList)%>

要么

<%= Html.DropDownListFor(m => m.IncludesWeekendsId,Model.YesNoList)%>

然后,从视图返回时,将IncludesWeekendsId转换回模型上的正确值.

在这种情况下,如果我没有迂腐的情绪,我可能会选择1.但是,如果您必须为下拉项使用不同的值而不是将模型的属性值转换为字符串,则解决方案3是一种通用的,通常是干净的方法解决此问题.

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....