首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SelectListItem selected = true不在视图中工作

SelectListItem selected = true不在视图中工作
EN

Stack Overflow用户
提问于 2012-05-11 14:43:32
回答 6查看 56.1K关注 0票数 18

我有一个性别选择字段(-选择当页面加载时,我希望在加载页面时自动选择在模型pm.Gender中选择的性别。

pm.Gender的值返回为:

  • "M"

  • "F"

视图:

代码语言:javascript
运行
复制
<%: Model.Gender %>
<%: Html.DropDownListFor(m => m.Gender, (IEnumerable<SelectListItem>)ViewData["gender"], new { @class = "span2" })%>

控制器:

代码语言:javascript
运行
复制
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的解决方案之后要做的事情。

视图:

代码语言:javascript
运行
复制
<%: Html.DropDownListFor(m => m.Gender, (SelectList)(ViewData["gender"]), new { @class = "span2" }) %>

控制器:

代码语言:javascript
运行
复制
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'.

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-05-11 15:59:25

我建议您最好为SelectList使用强类型属性(而不是使用ViewBag/ViewData)。我相信你期待的是,你的下拉列表是预先选择与性别选择在模型中。这里有一个解决方案(代码不是100%干净的)。但这是可行的)

模型

代码语言:javascript
运行
复制
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 });
        }
    }
}

控制器动作

代码语言:javascript
运行
复制
public ActionResult MyView()
{
    TestModel m = new TestModel();
    m.Gender = "Female";
    return View(m);
}

MyView.cshtml

代码语言:javascript
运行
复制
@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网络应用模板)。更大的文件大小)

票数 24
EN

Stack Overflow用户

发布于 2019-03-10 05:09:48

这是在 MVC Razor中已知的错误。根据已知的bug文档

“这个问题背后的原因是,asp.net MVC首先在下拉列表的名称和模型上的属性之间寻找匹配。如果匹配,则SelectList的选定值将被覆盖。更改下拉列表的名称是补救问题所需的全部工作。”

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

代码语言:javascript
运行
复制
 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名称

代码语言:javascript
运行
复制
@Html.DropDownList("paymentTypeListNew", (List<SelectListItem>)ViewBag.paymentTypeList, new { @class = "form-control select2 select1" })

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

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

代码语言:javascript
运行
复制
 @Html.DropDownList("paymentTypeList") 

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

代码语言:javascript
运行
复制
$("#paymentTypeList").addClass("form-control");
            $("#paymentTypeList").addClass("select2");
票数 9
EN

Stack Overflow用户

发布于 2012-05-11 15:00:03

方法使用select获取性别:

代码语言:javascript
运行
复制
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;
}

在主计长中:

代码语言:javascript
运行
复制
//without selectedValue
ViewData["gender"]  = new SelectList(GetGender(), "Key", "Value");

代码语言:javascript
运行
复制
//"Male" as selectedValue
ViewData["gender"]  = new SelectList(GetGender(), "Key", "Value", "Male");

认为:

代码语言:javascript
运行
复制
Html.DropDownListFor(m => m.Gender, (SelectList)(ViewData["gender"]),
                        new { @class = "span2" })
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10553593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档