返回Razor View后,下拉列表无法记住上次选择的值

时间:2013-12-01 21:34:18

标签: asp.net-mvc post html-select selecteditem html.dropdownlistfor

我的MVC4应用程序中有一个自定义Dropdownlist,虽然所有其他Dropdownlist都能记住返回Razor View后的最后一个选定值(即由于未在Controller中验证模型)。如何在提交表单之前让此Dropdownlist记住所选值?


查看:使用此自定义下拉列表的代码

@Html.LabelFor(m=>m.Applicant.MeetingId)              
@Html.MyDropdownListFor(m => m.Applicant.MeetingId, ViewBag.MeetingData as List<MyHelpers.MySelectItem>, 
null, new { name = "meetingId", id = "meetingId"})                   
@Html.ValidationMessageFor(m => m.Applicant.MeetingId, null , new { @class = "ValidationErrors" })


控制器:填充此自定义下拉列表的方法

private void PopulateMeetingsDropDownList(object selectedMeetings = null)
{
    var meetingsQuery = repository.Meetings
        .GroupJoin(repository.Cities, m => m.MeetingCityId, c => c.CityID, (m, c) => new { m, cA = c.DefaultIfEmpty() })
        .SelectMany(z => z.cA.Select(cA => new { m = z.m, cA }))
        .GroupJoin(repository.Cities, m => m.m.ParticipantCityAId, c => c.CityID, (m, c) => new { m.m, m.cA, cB = c.DefaultIfEmpty() })
        .SelectMany(w => w.cB.Select(cB => new { m = w.m, cA = w.cA, cB }))
        .GroupJoin(repository.Cities, m => m.m.ParticipantCityBId, c => c.CityID, (m, c) => new { m.m, m.cA, m.cB, cC = c.DefaultIfEmpty() })
        .SelectMany(t => t.cC.Select(cC => new { m = t.m, cA = t.cA, cB = t.cB, cC }))
        .Select(
            m =>
                new
                {
                    TotalParticipant = m.m.TotalParticipant,
                    MeetingID = m.m.MeetingID,
                    CityID = m.cA.CityID,
                    CityName = m.cA.CityName,
                    MeetingDate = m.m.MeetingStartDate,
                    MeetingName = m.m.MeetingName,
                    NameofMeetingCityIdA = m.cA != null ? m.cA.CityName : null,
                    NameofMeetingCityIdB = m.cB != null ? m.cB.CityName : null,
                    NameofMeetingCityIdC = m.cC != null ? m.cC.CityName : null
                })
        .OrderBy(x => x.CityName)
        .AsEnumerable()
        .Select(
            i => new
            {
                Value = i.MeetingID.ToString(),
                DisplayValue = string.Format("{0} ({1:dd MMMM yyyy})", i.NameofMeetingCityIdA, i.MeetingDate)),

                Expired = i.MeetingDate < DateTime.UtcNow,
                MaksimumCount = i.TotalParticipant,
                CurrentCount = GetMeetingCount(i.MeetingID)
            }
        ).ToList();

    var selectItems = new List<MyHelpers.MySelectItem>(meetingsQuery.Count);
    foreach (var record in meetingsQuery)
    {
        var item = new MyHelpers.MySelectItem
        {
            Text = record.DisplayValue,
            Value = record.Value
        };
        //If Meeting Date is expired or Count for the current record >= Total Participant
        if (record.Expired || record.CurrentCount >= record.MaksimumCount)
        {
            item.Class = "disabled";
            item.Disabled = "disabled";
        }
        selectItems.Add(item);
    }
    ViewBag.MeetingData = selectItems;
}


我的自定义助手:

public static MvcHtmlString MyDropdownList(this HtmlHelper htmlHelper, string name, IEnumerable<MySelectItem> list, string optionLabel, IDictionary<string, object> htmlAttributes)
    {
        TagBuilder dropdown = new TagBuilder("select");
        dropdown.Attributes.Add("name", name);
        dropdown.Attributes.Add("id", name);
        StringBuilder options = new StringBuilder();

        // Make optionLabel the first item that gets rendered.
        if (optionLabel != null)
            options = options.Append("<option value='" + String.Empty + "'>" + optionLabel + "</option>");

        foreach (var item in list)
        {
            if(item.Disabled == "disabled")
                options = options.Append("<option value='" + item.Value + "' class='" + item.Class + "' disabled='" + item.Disabled + "'>" + item.Text + "</option>");
            else
                options = options.Append("<option value='" + item.Value + "' class='" + item.Class + "'>" + item.Text + "</option>");
        }
        dropdown.InnerHtml = options.ToString();
        dropdown.MergeAttributes(new RouteValueDictionary(htmlAttributes));
        return MvcHtmlString.Create(dropdown.ToString(TagRenderMode.Normal));
    }

0 个答案:

没有答案