我在编辑页面中使用DropDownListFor帮助方法,我没有运气来选择我指定的值。我注意到Stackoverflow上有一个similar question。建议的解决方法是“在视图代码中填充SelectList”。问题是我已经尝试过了,但它仍然没有用。
<%= Html.DropDownListFor(model => model.States, new SelectList(Model.States.OrderBy(s => s.StateAbbr), "StateAbbr", "StateName", Model.AddressStateAbbr), "-- Select State --")%>
我设置了断点并验证了model.AddressStateAbbr的存在性(和有效性)。我只是不确定我错过了什么。
答案 0 :(得分:172)
经过一个小时的研究,我发现问题导致所选内容未设置为DropDownListFor
。原因是您使用ViewBag的名称与模型的属性相同。
示例
public class employee_insignia
{
public int id{get;set;}
public string name{get;set;}
public int insignia{get;set;}//This property will store insignia id
}
// If your ViewBag's name same as your property name
ViewBag.Insignia = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);
查看
@Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.Insignia, "Please select value")
所选选项不会设置为下拉列表,但是当您将ViewBag的名称更改为其他名称时,所选选项将显示正确。
实施例
ViewBag.InsigniaList = new SelectList(db.MtInsignia.AsEnumerable(), "id", "description", 1);
查看
@Html.DropDownListFor(model => model.insignia, (SelectList)ViewBag.InsigniaList , "Please select value")
答案 1 :(得分:30)
尝试:
<%= Html.DropDownListFor(
model => model.AddressStateAbbr,
new SelectList(
Model.States.OrderBy(s => s.StateAbbr),
"StateAbbr",
"StateName",
Model.AddressStateAbbr), "-- Select State --")%>
或用Razor语法:
@Html.DropDownListFor(
model => model.AddressStateAbbr,
new SelectList(
Model.States.OrderBy(s => s.StateAbbr),
"StateAbbr",
"StateName",
Model.AddressStateAbbr), "-- Select State --")
基于表达式的助手似乎不尊重SelectList中SelectListItems的Selected属性。
答案 2 :(得分:22)
如果您正确地使用模型并且使用模型 - 与所有这些ViewBag怪异不同 - 并且仍然看到问题,那是因为@Html.DropDownListFor(m => m.MyValue, @Model.MyOptions)
无法将MyValue
与其拥有的选项匹配在MyOptions
。这可能是两个原因:
MyValue
为空。您尚未在ViewModel中设置它。让其中一个MyOptions
拥有Selected=true
将无法解决此问题。MyValue
的类型与MyOptions
中的类型不同。因此,如果MyValue
为(int) 1
,但您的MyOptions
是填充字符串列表{"01", "02", "03", ...}
,则显然不会选择任何内容。答案 3 :(得分:16)
虽然没有解决这个问题 - 如果他们遵循我的思路,它可能有助于未来的googlers:
我想要一个多项选择,这个属性攻击 DropDownListFor 没有自动选择
Html.DropDownListFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems, new {multiple= "multiple" })
相反,我应该使用 ListBoxFor ,这使一切正常
Html.ListBoxFor(m => m.TrainingLevelSelected, Model.TrainingLevelSelectListItems)
答案 4 :(得分:1)
我也有类似的问题,我按如下方式解决,
model.States控制器上的属性为您需要选择的内容
model.States = “加利福尼亚”
然后你将“加利福尼亚”作为默认值。
答案 5 :(得分:0)
这个问题很常见。将viewbag属性名称更改为其他页面上使用的模型变量名称。
答案 6 :(得分:0)
另一件事是检查它是不是你自己的代码,是为了确保没有javascript函数改变页面加载的值。经过几个小时的撞击墙壁阅读所有这些解决方案后,我发现这就是我发生的事情。
答案 7 :(得分:0)
我最近遇到了这个问题。它使我发疯了大约一个小时。
就我而言,我没有使用与模型属性同名的ViewBag
变量。
在跟踪源控件的更改后,问题出在我的 action 中,有一个与模型属性同名的参数:
public ActionResult SomeAction(string someName)
{
var model = new SomeModel();
model.SomeNames = GetSomeList();
//Notice how the model property name matches the action name
model.someName = someName;
}
在视图中:
@Html.DropDownListFor(model => model.someName, Model.SomeNames)
我只是将操作的参数更改为其他名称,然后它又开始工作了:
public ActionResult SomeAction(string someOtherName)
{
//....
}
我想也可以更改模型的属性名称,但是在我的情况下,参数名称没有意义,所以...
希望这个答案可以省去别人的麻烦。
答案 8 :(得分:0)
至少对我来说,这个问题与IEnumerable<T>
有关。
基本上发生的是,视图和模型对于相同的属性没有相同的引用。
如果您这样做
IEnumerable<CoolName> CoolNames {get;set;} = GetData().Select(x => new CoolName{...});}
然后使用
将其绑定@Html.DropDownListFor(model => model.Id, Model.CoolNames)
视图失去对CoolNames属性的跟踪,
一个简单的解决方法是在投影(.ToList()
)之后添加.Select()
;)。
答案 9 :(得分:0)
我有同样的问题。在下面的示例中,变量ViewData [“ DATA_ACREDITO_MODELO_INTEGRADO”]具有一个SelectListItem列表,该列表具有默认的选定值,但该属性无法直观地反映出来。
// data
var p_estadoAcreditacion = "NO";
var estadoAcreditacion = new List<SelectListItem>();
estadoAcreditacion.Add(new SelectListItem { Text = "(SELECCIONE)" , Value = " " });
estadoAcreditacion.Add(new SelectListItem { Text = "SI" , Value = "SI" });
estadoAcreditacion.Add(new SelectListItem { Text = "NO" , Value = "NO" });
if (!string.IsNullOrEmpty(p_estadoAcreditacion))
{
estadoAcreditacion.First(x => x.Value == p_estadoAcreditacion.Trim()).Selected = true;
}
ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] = estadoAcreditacion;
我通过使DropdownList的第一个参数不同于id属性来解决它。
// error:
@Html.DropDownList("SELECT__ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id = "SELECT__ACREDITO_MODELO_INTEGRADO"
...
// solved :
@Html.DropDownList("DROPDOWNLIST_ACREDITO_MODELO_INTEGRADO"
, ViewData["DATA_ACREDITO_MODELO_INTEGRADO"] as List<SelectListItem>
, new
{
id = "SELECT__ACREDITO_MODELO_INTEGRADO"
...
答案 10 :(得分:0)
我知道这是一个老问题,但我在2020年遇到了同样的问题。
事实证明,问题在于模型属性被称为“ Title”,我将其重命名为“ GivenTitle”,并且现在可以正常使用了。
来自
Html.DropDownListFor(m => m.Title, Model.Titles, "Please Select", new { @class = "form-control" })
到
Html.DropDownListFor(m => m.GivenTitle, Model.GivenTitles, "Please Select", new { @class = "form-control" })