我有同样的问题,因为这在这里 ,我相信,但解决办法是不是为我工作。 我的问题是,我的模型子集合我的主要观点的视图模型内。 它们包含两个字段,一个下拉列表和密码字段来显示的数据。 每个下拉列表选择必须是唯一的。 一切都保存和发送到正常显示,但是当观点被称为,但密码字段是下拉列表不绑定到选定的值。 他们都默认为第一选择,即使他们想绑定到该属性是唯一的,只能有一个第一个值。 任何帮助或洞察力的赞赏。 谢谢。
这是在我看来,部分地方的问题正在发生。 我注释掉了我的努力和尝试了上面的链接的解决办法都无济于事:
@functions {
private IEnumerable<SelectListItem> Mark(IEnumerable<SelectListItem> items, object Id)
{
foreach (var item in items)
if (string.CompareOrdinal(item.Value, Convert.ToString(Id)) == 0)
item.Selected = true;
return items;
}
}
@for (int j = 0; j < Model.PasswordResetQuestionUserAnswers.Count(); j++)
{
@Html.Hidden("PasswordResetQuestionUserAnswers.Index", j)
@Html.HiddenFor(p => Model.PasswordResetQuestionUserAnswers[j].Id)
@Html.HiddenFor(p => Model.PasswordResetQuestionUserAnswers[j].UserId)
<div class="form-group">
<label class="col-md-2 control-label">Password Reset Question @(j+1)</label>
<div class="col-md-6">
@*@Html.DropDownList("PasswordResetQuestionUserAnswers[" + j + "].PasswordResetQuestionId", Model.PasswordResetQuestionList, new { @class = "form-control passwordQuestion" })*@
@*@Html.DropDownListFor(x => Model.PasswordResetQuestionUserAnswers[j].PasswordResetQuestionId, Model.PasswordResetQuestionList, new { @class = "form-control passwordQuestion" })*@
@Html.DropDownListFor(x => Model.PasswordResetQuestionUserAnswers[j].PasswordResetQuestionId, Mark(Model.PasswordResetQuestionList, Model.PasswordResetQuestionUserAnswers[j].PasswordResetQuestionId))
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">Password Reset Answer @(j+1)</label>
<div class="col-md-6">
@Html.Password("PasswordResetQuestionUserAnswers[" + j + "].Answer", Model.PasswordResetQuestionUserAnswers[j].Answer, new { @class = "form-control passwordQuestionUserAnswer" })
@*@Html.PasswordFor(x => Model.PasswordResetQuestionUserAnswers[j].Answer, new { @class = "form-control passwordQuestionUserAnswer" })*@
</div>
</div>
}
我只是有这个同样的问题。 这句法为我工作:
@Html.DropDownListFor(x => x.ChildCollection[i].ChildID, new SelectList(ViewBag.ChildCollectionSelect as SelectList, "Value", "Text", Model.ChildCollection[i].ChildID))
定义的SelectList如新,则专门设置从模型中选择的值。
这是一个适应于上面的例子,对于我在一个类似的情况,哪里有什么工作itm
代表集合中的子对象。 我不完全相信一切都在例如回事 - 太多的“问题”,“用户”和“答案”,而是说,如果你想用户的下拉列表,它充满了特别的一个已被分配给该子项:
foreach (var itm in Model.PasswordResetQuestionUserAnswers)
{
@Html.DropDownListFor(modelItem => itm.UserId,
new SelectList( (IEnumerable<SelectListItem>)ViewData["users"], "Value", "Text", itm.UserId),
htmlAttributes: new { @class = "form-control" }
)
}
在那里你会填补ViewData["users"]
像这样在呈现视图控制器方法:
var usersList = GetUsersList();
ViewData["users"] = usersList;
并有这些支持功能:
private static SelectListItem[] _UsersList;
/// <summary>
/// Returns a static category list that is cached
/// </summary>
/// <returns></returns>
public SelectListItem[] GetUsersList()
{
if (_UsersList == null)
{
var users = repository.GetAllUsers().Select(a => new SelectListItem()
{
Text = a.USER_NAME,
Value = a.USER_ID.ToString()
}).ToList();
users.Insert(0, new SelectListItem() { Value = "0", Text = "-- Please select your user --" });
_UsersList = users.ToArray();
}
// Have to create new instances via projection
// to avoid ModelBinding updates to affect this
// globally
return _UsersList
.Select(d => new SelectListItem()
{
Value = d.Value,
Text = d.Text
})
.ToArray();
}
Repository.cs
我的仓库功能GetAllUsers()
的函数,上面:
Model1 db = new Model1(); // Entity Framework context
// Users
public IList<USERS> GetAllUsers()
{
return db.USERS.OrderBy(e => e.USER_ID).ToList();
}
Users.cs
public partial class USERS
{
[Key]
public int USER_ID { get; set; }
[Required]
[StringLength(30)]
public string USER_NAME { get; set; }
}
编辑
重新阅读的问题后,似乎它是关于发布密码重置的问题。
foreach (var itm in Model.PasswordResetQuestionUserAnswers)
{
@Html.DropDownListFor(modelItem => itm.PasswordResetQuestionId,
new SelectList( (IEnumerable<SelectListItem>)ViewData["pwordResetQuestions"], "Value", "Text", itm.PasswordResetQuestionId),
htmlAttributes: new { @class = "form-control" }
)
}
而且你必须有一个ViewData["pwordResetQuestions"]
中呈现该视图控制器方法充满这样的:
var questionsList = GetQuestionsList();
ViewData["questions"] = questionsList;
和这些支持功能/对象:
private SelectListItem[] _QuestionsList;
public SelectListItem[] GetQuestionsList()
{
if (_QuestionsList == null)
{
var questions = PasswordResetQuestionUserAnswers.Select(a => new SelectListItem()
{
Text = a.Answer, //? I didn't see a "PasswordResetQuestionText" call in your example, so...
Value = a.PasswordResetQuestionId.ToString()
}).ToList();
questions.Insert(1, new SelectListItem() { Value = "1", Text = "Mother's Maiden Name" });
questions.Insert(2, new SelectListItem() { Value = "2", Text = "Elementary school attended" });
_QuestionsList = questions.ToArray();
}
// Have to create new instances via projection
// to avoid ModelBinding updates to affect this
// globally
return _QuestionsList
.Select(d => new SelectListItem()
{
Value = d.Value,
Text = d.Text
})
.ToArray();
}
我硬编码在有一些问题 - 我有点怀疑你有一个表,对于他们来说,通常企业只有不到10,但你总是可以做到这一点的数据库调用,像我一样为用户表,如果他们使用一个数据库表 - 这就是为什么我离开那个例子存在。
我有同样的问题,并与它战斗。 上面的例子让我渡过了难关,但我可以用你的代码有它的方式来简化,用一个修改:
原始代码
@Html.DropDownListFor(x => Model.PasswordResetQuestionUserAnswers[j].PasswordResetQuestionId, Model.PasswordResetQuestionList, new { @class = "form-control passwordQuestion" })
更新代码:(用新的SelectList把它包)
@Html.DropDownListFor(x => Model.PasswordResetQuestionUserAnswers[j].PasswordResetQuestionId, new SelectList(Model.PasswordResetQuestionList, "Value", "Text", Model.PasswordResetQuestionUserAnswers[j].PasswordResetQuestionId, new { @class = "form-control passwordQuestion" })
这消除了对ViewBag或ViewData的需要。