Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SelectListItem selected=true不在视图中工作_C#_Asp.net Mvc - Fatal编程技术网

C# SelectListItem selected=true不在视图中工作

C# SelectListItem selected=true不在视图中工作,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个性别选择字段(--select--,男性,女性),我正在我的控制器中填充它。加载页面时,我希望在加载页面时自动选择模型pm.gender中选择的性别 pm.Gender中的值返回为: “” “M” “F” 查看: <%: Model.Gender %> <%: Html.DropDownListFor(m => m.Gender, (IEnumerable<SelectListItem>)ViewData["gender"], new { @cla

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

pm.Gender
中的值返回为:

  • “”
  • “M”
  • “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;
<%: 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;
控制器:

<%: 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;
<%: 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;
gender=new[]{“Select”、“Male”、“Female”};
List genderselectList=新列表();
foreach(性别中的字符串项)
{
选择列表sli;
if(item.Trim().StartsWith(pm.Gender))
sli=新选择列表(GetGender(),项,项,项);
其他的
sli=新选择列表(GetGender(),项,项);
//没有选择的值
性别选民名单。添加(sli);
}
ViewData[“性别”]=性别选择列表;
当我这样做时,我得到以下异常:
无法将类型为“System.Collections.Generic.List`1[System.Web.Mvc.SelectList]”的对象强制转换为类型为“System.Web.Mvc.SelectList”。


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

在控制器中尝试以下操作:

string[] gender = new string[] {"Male", "Female"};
string selectedGender = gender.Where(x => x.StartsWith(pm.gender)).FirstOrDefault();
ViewData["gender"] = new SelectList(gender, selectedGender);
//without selectedValue
ViewData["gender"]  = new SelectList(GetGender(), "Key", "Value");
并且认为:

<%: Html.Dropdownlist(x => x.Gender, ViewData["gender"], "Select") %>
Html.DropDownListFor(m => m.Gender, (SelectList)(ViewData["gender"]),
                        new { @class = "span2" })
x.性别,查看数据[“性别”],“选择”)%>

通过选择获取性别的方法:

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;
}

他认为:

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

我建议最好对SelectList使用强类型属性(而不是使用ViewBag/ViewData)。我相信你所期待的是,你的dropdownlist将与模型中的性别选择一起预先选择。这里有一个解决方案(代码不是100%干净的,但这会起作用)

模型

MyView.cshtml

@model TestModel

@{
    ViewBag.Title = "MyView";
}

<h2>MyView</h2>
@using (Html.BeginForm())
{
    <div>
          @Html.DropDownListFor(model => model.Gender, Model.GenderList)
    </div>
}
@model TestModel
@{
ViewBag.Title=“MyView”;
}
MyView
@使用(Html.BeginForm())
{
@DropDownListFor(model=>model.Gender,model.GenderList)
}
输出

选择“女性”选项的下拉列表

编辑

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

1) (使用MVC4空模板。文件大小较小,最小值为零)

2) (使用MVC4 internet应用程序模板。文件大小更大)

试试这个

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>
公共静态列表listseo{get;}=新列表
{
新建SelectListItem{Selected=true,Value=“N”,Text=“Seleccione”},
新建SelectListItem{Value=“F”,Text=“Femenino”},
新建SelectListItem{Value=“M”,Text=“mangino”}
};

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

此问题的原因是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;
现在,如果您担心无法初始化CSS,那么您需要通过编程来初始化CSS。例如,如果您正在使用Jquery,那么您可以使用

$("#paymentTypeList").addClass("form-control");
            $("#paymentTypeList").addClass("select2");

在我自己寻找这个问题的答案之后,我有了一些提示,但这就是最终的解决方案。这是一种扩展方法。我使用的是MVC5,目标是4.52。下面的代码将选择设置为列表中的第一项,因为这正是我所需要的,您可能只希望传递一个字符串并跳过枚举-但我还希望确保从DB返回了一些内容到我的SelectList)

扩展方法:

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

示例代码:

选择列表功能:


您可以将其作为一个通用的全包函数/扩展,但对我来说,它的工作方式是一样的。

这只是在IE9中吗?不久前我遇到了一个类似的问题,我无法解决。它在任何浏览器中都无法工作。请使用
ViewData[“gender”]=new SelectList(GetGender(),“Key”,“Value”,“Male”)如我的答案所示。你没有像我发布的那样使用它,而是混淆了它。是的,但在这种情况下,它硬编码为“男性”,但我需要从pm.Gender中动态选择它。然后使用
而不使用selectedValue
,因为我发布了我的答案。模型活页夹将完成其余工作。请阅读答案。这似乎导致了一个异常:c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\a2ddcf57\568ca5cc\App\u Web\u index.aspx.73c2a466.g30mf9nu.0.cs(423):错误CS1026:)预期您在某个地方缺少一个结尾。更正缺少的括号(在我未编辑的代码中没有),并让我知道它是否有效。好的。让我玩一会儿。我很快会给你回复的。谢谢我在实现了你的解决方案后更新了我的问题,但我仍然得到一个例外。你能看看我做错了什么吗?感谢您遇到的是由于语句不完整而导致的编译器错误。我使用Razor视图,因此它以@符号开头。请检查是否是谢谢你的回答。我会让你知道一旦我得到它的工作。在MVC4它没有工作!仍然选择列表中的第一项。@Umitk Downvote!!!你是认真的吗,伙计?首先,这个问题在三年前得到了回答。你按照指示做了吗?它也适用于MVC4。@Umitk仅供参考:我已将一个演示项目上载到github(使用MVC4 internet应用程序模板)。运行应用程序,我在主页上添加了一个指向“MyView”的链接。这里是github链接,如果你可以编辑你的答案,我可以投票。现在我不能投票了,谢谢!经过一个小时的调试,我找到了你的答案。这个bug非常烦人,几乎无法调试。
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;
}