Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.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# DropDownListFor()未设置为模型值_C#_Asp.net - Fatal编程技术网

C# DropDownListFor()未设置为模型值

C# DropDownListFor()未设置为模型值,c#,asp.net,C#,Asp.net,我在我的模型上循环,但是来自模型的值不是下拉列表中显示为所选项目的值。相反,列表总是只显示第一个条目 @Html.DropDownListFor(modelItem => item.RecordType, Model.RecordTypes, new { id="recordType_" + item.TransactionID }) item.RecordType的模型值为5,我将其打印出来,以便知道它就是该值。但是,下拉列表显示初始值为4,而不是公司值为5,这是我们的模型项目值。源中

我在我的模型上循环,但是来自模型的值不是下拉列表中显示为所选项目的值。相反,列表总是只显示第一个条目

@Html.DropDownListFor(modelItem => item.RecordType, Model.RecordTypes, new { id="recordType_" + item.TransactionID })
item.RecordType的模型值为5,我将其打印出来,以便知道它就是该值。但是,下拉列表显示初始值为4,而不是公司值为5,这是我们的模型项目值。源中的列表定义为:

<select data-val="true" data-val-number="The field RecordType must be a number." id="recordType_63" name="item.RecordType">
<option value="4">Initial</option>
<option value="5">Firm</option>
<option value="6">Announced</option>
<option value="7">N/A</option>
</select>
如何将下拉列表设置为模型值

public IEnumerable<SelectListItem> RecordTypes
        {
            //get { return new SelectListItem(recordTypes, "RECORD_TYPE_ID", "RECORD_TYPE");  }
            get
            {
                return (from r in recordTypes
                        select new SelectListItem { Text = r.RECORD_TYPE, Value = r.RECORD_TYPE_ID.ToString() });
            }
        }

组装RecordTypes SelectListItem集合时,请确保为当前选定的项设置Selected=true-它不会为您设置它

假设视图模型上的RecordType变量与数据集的RECORD_TYPE_ID变量匹配,则可以将变量的创建更新为:

from r in recordTypes
select new SelectListItem { Text = r.RECORD_TYPE, Value = r.RECORD_TYPE_ID.ToString(), Selected = r.RECORD_TYPE_ID == this.RecordType }
如果在视图的多个下拉列表中使用RecordTypes变量,则必须更改方法并为每个下拉列表创建IEnumerable。苏卡斯:

@Html.DropDownListFor(modelItem => item.RecordType, RecordTypes.Select(rt => new SelectListItem { Text = rt.Text, Value = rt.Value, Selected = rt.Value == item.RecordType}))

您可以通过在Html.DropDownListFor中创建

这会将IEnumerable和一个参数(在本例中为item.RecordType)一起传递到构造函数中,让它知道要选择哪个项

编辑:回应评论

您可以使用SelectList的重载,它允许您指定DataTextField和DataValueField,在您的情况下,这两个字段将分别是文本和值

重新处理Model.RecordTypes要返回SelectList并在其中执行必要的操作,可以使用方法并传入要选择的值。比如:

public SelectList RecordTypes(object selectedValue)
{
    return new SelectList(recordTypes, "RECORD_TYPE", "RECORD_TYPE_ID", selectedValue);
}

希望这能有所帮助。

如何构造Model.RecordTypes?编辑答案以显示这一点。我注意到SelectListItem需要2个字符串。我的记录的值是整数。不匹配是否导致问题?处理这个问题的最佳方法是什么,因为我认为在所有数据库中,这些id都会存储为整数,因为它们是整数,但在html中,它们似乎被视为字符串。在视图中,我无法对我的模型项执行ToString操作,因为它错误地告诉我不能这样更改模型。该集合不是为每个记录组装的。它组装一次并传递给视图。我可以有x个记录显示这个下拉框,它们都有不同的值,因此在RecordTypes程序集上设置它似乎不起作用。这似乎是合乎逻辑的,但我得到的是一个列表框,其中所有的值都是:System.Web.Mvc.SelectListItem。这很有效!我想在这一点上,我可以从模型中返回实际的列表类型,而不是将其转换为SelectList,并在视图中放置实际模型的id/value列。谢谢你的帮助!您上次的编辑不起作用,因为我可以有多条记录需要显示我正在循环使用item.RecordType的模型。因此,在视图中执行此操作是必需的,并且与第一个示例中的操作类似。
public SelectList RecordTypes(object selectedValue)
{
    return new SelectList(recordTypes, "RECORD_TYPE", "RECORD_TYPE_ID", selectedValue);
}