SelectListItem selected = true在视图中不起作用

Far*_*mad 14 c# asp.net-mvc

我有一个性别选择字段(--Select--,Male,Female),我在我的控制器中填充它.页面加载时,我希望pm.Gender在页面加载时自动选择模型中选择的性别.

价值来自pm.Gender:

  • ""
  • "M"
  • "F"

视图:

<%: Model.Gender %>
<%: Html.DropDownListFor(m => m.Gender, (IEnumerable<SelectListItem>)ViewData["gender"], new { @class = "span2" })%>
Run Code Online (Sandbox Code Playgroud)

控制器:

gender = new[] { "Select", "Male", "Female" };
List<SelectListItem> genderselectList = new List<SelectListItem>();
foreach (string item in gender)
{
   SelectListItem sli = new SelectListItem { Text = item, Value = item };

   if (item.Trim().StartsWith(pm.Gender))
      sli.Selected = true;

   genderselectList.Add(sli);
}

ViewData["gender"] = genderselectList;
Run Code Online (Sandbox Code Playgroud)

在调试应用程序之后,我可以看到genderselectList包含适当数据的正确数据Selected = true应该被选中.但是当页面加载时,在下拉列表中没有选择任何应该使用Html.DropDownListFor.

编辑:在任何浏览器中都不起作用.

有谁知道可能导致这个问题的原因?任何帮助,将不胜感激.

干杯.

编辑:(实施Kaf解决方案后)
好的,这就是我在实施Kaf解决方案后所做的工作.

视图:

<%: Html.DropDownListFor(m => m.Gender, (SelectList)(ViewData["gender"]), new { @class = "span2" }) %>
Run Code Online (Sandbox Code Playgroud)

控制器:

gender = new[] { "Select", "Male", "Female" };
List<SelectList> genderselectList = new List<SelectList>();
foreach (string item in gender)
{
    SelectList sli;

    if (item.Trim().StartsWith(pm.Gender))
        sli = new SelectList(GetGender(), item, item, item); 
    else
        sli = new SelectList(GetGender(), item, item);
        //without selectedValue

    genderselectList.Add(sli);
}

ViewData["gender"] = genderselectList;
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我得到以下异常:
Unable to cast object of type 'System.Collections.Generic.List`1[System.Web.Mvc.SelectList]' to type 'System.Web.Mvc.SelectList'.

谁知道我做错了什么?

Pra*_*nam 21

我建议如果你对SelectList使用强类型属性(而不是使用ViewBag/ViewData)会更好.我相信您期望的是您的下拉列表是通过模型中的性别选择预先选择的.这是一个解决方案(代码不是100%干净.但这会起作用)

模型

public class TestModel
{
    public string Gender { get; set; }

    public IEnumerable<SelectListItem> GenderList
    {
        get
        {
            List<SelectListItem> list = new List<SelectListItem> { new SelectListItem() { Text = "Select", Value = "Select" }, new SelectListItem() { Text = "Male", Value = "Male" }, new SelectListItem() { Text = "Female", Value = "Female" } };
            return list.Select(l => new SelectListItem { Selected = (l.Value == Gender), Text = l.Text, Value = l.Value });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器动作

public ActionResult MyView()
{
    TestModel m = new TestModel();
    m.Gender = "Female";
    return View(m);
}
Run Code Online (Sandbox Code Playgroud)

MyView.cshtml

@model TestModel

@{
    ViewBag.Title = "MyView";
}

<h2>MyView</h2>
@using (Html.BeginForm())
{
    <div>
          @Html.DropDownListFor(model => model.Gender, Model.GenderList)
    </div>
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT

选择"女性"选项的下拉列表

在此输入图像描述

编辑

根据评论,在下面找到示例项目的链接

1)https://github.com/prashanth-t/DropdownDemo_BareBones(使用MVC 4空模板.较小的文件大小)

2)https://github.com/prashanth-t/DropdownDemo(使用MVC 4互联网应用程序模板.文件大小更大)


vib*_*006 8

这是ASP.NET MVC Razor 视图中的一个已知错误。根据已知的错误文档

"这个问题背后的原因是 asp.net MVC 首先寻找下拉名称和模型属性之间的匹配。如果匹配,SelectList 的选定值将被覆盖。更改下拉名称只需按下即可解决问题。

我在这里举了一个小例子,你可以用它来测试分辨率。

 var paymentTypeList = new List<SelectListItem>
                {
                    new SelectListItem { Text = "Select Payment Type", Value = "NA" },
                    new SelectListItem { Text = "Card", Value = "Card" },
                    new SelectListItem { Text = "Paytm Wallet", Value = "Paytm Wallet" },
                    new SelectListItem { Text = "Cash", Value = "Cash", Selected = true },
                    new SelectListItem { Text = "Credit", Value = "Credit" },
                    new SelectListItem { Text = "Other", Value = "Other" }
                };
 ViewBag.paymentTypeList = paymentTypeList;
Run Code Online (Sandbox Code Playgroud)

解决方案 1(最简单) - 在 MVC 视图中更改选择列表 ID 的声明 ID 名称,例如

@Html.DropDownList("paymentTypeListNew", (List<SelectListItem>)ViewBag.paymentTypeList, new { @class = "form-control select2 select1" })
Run Code Online (Sandbox Code Playgroud)

解决方案 2:(仅使用与 viewbag/viewdata 属性匹配的 @Html.DropDownList 的单个构造函数)

为了确保选中的项目(本例中的现金)被选中,请在 MVC Razor 视图中执行以下操作。仅使用以下构造函数,没有任何 CSS 或新对象值

 @Html.DropDownList("paymentTypeList") 
Run Code Online (Sandbox Code Playgroud)

现在,如果您担心无法初始化 CSS,那么您需要以编程方式初始化 css。例如,如果您使用的是 Jquery,那么您可以使用

$("#paymentTypeList").addClass("form-control");
            $("#paymentTypeList").addClass("select2");
Run Code Online (Sandbox Code Playgroud)