18

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

返回的值pm.Gender如下:

  • " "
  • “米”
  • “F”

看法:

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

控制器:

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;

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

编辑:不适用于任何浏览器。

任何人都知道可能导致此问题的原因是什么?任何帮助,将不胜感激。

干杯。

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

看法:

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

控制器:

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;

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

有人知道我在做什么错吗?

4

6 回答 6

23

我建议最好为 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 });
        }
    }
}

控制器动作

public ActionResult MyView()
{
    TestModel m = new TestModel();
    m.Gender = "Female";
    return View(m);
}

我的视图.cshtml

@model TestModel

@{
    ViewBag.Title = "MyView";
}

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

输出

选择了“女性”选项的下拉菜单

在此处输入图像描述

编辑

根据评论找到以下示例项目的链接

1) https://github.com/prashanth-t/DropdownDemo_BareBones(使用 MVC 4 空模板。文件更小,最小)

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

于 2012-05-11T15:59:25.767 回答
9

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

"这个问题背后的原因是 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;

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

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

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

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

 @Html.DropDownList("paymentTypeList") 

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

$("#paymentTypeList").addClass("form-control");
            $("#paymentTypeList").addClass("select2");
于 2019-03-10T05:09:48.140 回答
3

使用 select 获取性别的方法:

private Dictionary<string,string> GetGender(){
    Dictionary<string, string> myDic = new Dictionary<string, string>();
    myDic.Add(System.DBNull.Value.ToString(), "Select");
    myDic.Add("Male", "Male");
    myDic.Add("Female", "Female");
    return myDic;
}

在控制器中:

//without selectedValue
ViewData["gender"]  = new SelectList(GetGender(), "Key", "Value");

或者

//"Male" as selectedValue
ViewData["gender"]  = new SelectList(GetGender(), "Key", "Value", "Male");

在视图中:

Html.DropDownListFor(m => m.Gender, (SelectList)(ViewData["gender"]),
                        new { @class = "span2" })
于 2012-05-11T15:00:03.803 回答
2

在控制器中试试这个:

string[] gender = new string[] {"Male", "Female"};
string selectedGender = gender.Where(x => x.StartsWith(pm.gender)).FirstOrDefault();
ViewData["gender"] = new SelectList(gender, selectedGender);

在视图中:

<%: Html.Dropdownlist(x => x.Gender, ViewData["gender"], "Select") %>
于 2012-05-11T14:57:54.443 回答
0

试试这个;

public static List<SelectListItem> ListSexo { get; } = new List<SelectListItem>
    {
        new SelectListItem{Selected =true, Value="N", Text="Seleccione"},
        new SelectListItem{Value="F", Text="Femenino"},
        new SelectListItem{Value="M", Text="Masculino"}
    };

<select asp-for="Sexo" asp-items="Commons.ListSexo" class="form-control"></select>
于 2017-10-18T13:24:58.350 回答
0

在自己寻找这个问题的答案之后——我一路上得到了一些提示,但这是最终的解决方案。它是一种扩展方法。我正在使用 MVC 5 C# 4.52 是目标。下面的代码将选择设置为列表中的第一项,因为这是我需要的,您可能只想传递一个字符串并跳过枚举 - 但我也想确保我有一些东西从数据库返回到我的 SelectList)

扩展方法:

public static class SelectListextensions
{

    public static System.Web.Mvc.SelectList SetSelectedValue
(this System.Web.Mvc.SelectList list, string value)
    {
        if (value != null)
        {
            var selected = list.Where(x => x.Text == value).FirstOrDefault();
            selected.Selected = true;                
        }
        return list;
    }    
}

对于那些喜欢完全低调的人(比如我)来说,这里是用法。对象类别有一个定义为名称的字段 - 该字段将在下拉列表中显示为文本。您可以在上面的代码中看到对 Text 属性的测试。

示例代码:

SelectList categorylist = new SelectList(dbContext.Categories, "Id", "Name");

SetSelectedItemValue(categorylist);

选择列表功能:

private SelectList SetSelectedItemValue(SelectList source)
{
   Category category = new Category();

    SelectListItem firstItem = new SelectListItem();

    int selectListCount = -1;

    if (source != null && source.Items != null)
    {
        System.Collections.IEnumerator cenum = source.Items.GetEnumerator();

        while (cenum.MoveNext())
        {
            if (selectListCount == -1)
            {
                selectListCount = 0;
            }

            selectListCount += 1;

            category = (Category)cenum.Current;

            source.SetSelectedValue(category.Name);

            break;
        }
        if (selectListCount > 0)
        {
            foreach (SelectListItem item in source.Items)
            {
                if (item.Value == cenum.Current.ToString())
                {
                    item.Selected = true;

                    break;
                }
            }
        }
    }
    return source;
}

你可以把它变成一个通用的全包功能/扩展——但它对我来说是这样工作的。

于 2019-08-20T02:58:34.783 回答