ASP.NET MVC4型号的子集合下拉列表不正确的结合(ASP.NET MVC4 Model

2019-10-20 08:00发布

我有同样的问题,因为这在这里 ,我相信,但解决办法是不是为我工作。 我的问题是,我的模型子集合我的主要观点的视图模型内。 它们包含两个字段,一个下拉列表和密码字段来显示的数据。 每个下拉列表选择必须是唯一的。 一切都保存和发送到正常显示,但是当观点被称为,但密码字段是下拉列表不绑定到选定的值。 他们都默认为第一选择,即使他们想绑定到该属性是唯一的,只能有一个第一个值。 任何帮助或洞察力的赞赏。 谢谢。

这是在我看来,部分地方的问题正在发生。 我注释掉了我的努力和尝试了上面的链接的解决办法都无济于事:

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

Answer 1:

我只是有这个同样的问题。 这句法为我工作:

 @Html.DropDownListFor(x => x.ChildCollection[i].ChildID, new SelectList(ViewBag.ChildCollectionSelect as SelectList, "Value", "Text", Model.ChildCollection[i].ChildID))

定义的SelectList如新,则专门设置从模型中选择的值。



Answer 2:

这是一个适应于上面的例子,对于我在一个类似的情况,哪里有什么工作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,但你总是可以做到这一点的数据库调用,像我一样为用户表,如果他们使用一个数据库表 - 这就是为什么我离开那个例子存在。



Answer 3:

我有同样的问题,并与它战斗。 上面的例子让我渡过了难关,但我可以用你的代码有它的方式来简化,用一个修改:

原始代码

@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的需要。



文章来源: ASP.NET MVC4 Model's Child Collection Drop Down List not binding properly