【问题标题】:Setting selected DropDownListFor item设置选中的 DropDownListFor 项
【发布时间】:2013-11-16 17:25:58
【问题描述】:

我无法让DropDownListFor 使用下面的视图模型设置选定的StateCode

编辑

根据下面给出的答案更改代码。

型号

public partial class ZipCodeTerritory
{
    public string ChannelCode { get; set; }
    public string DrmTerrDesc { get; set; }
    public string IndDistrnId { get; set; }
    public string StateCode { get; set; }
    public string ZipCode { get; set; }
    public System.DateTime? DisplayEndDate { get; set; }
    public System.DateTime EndDate { get; set; }
    public System.DateTime EffectiveDate { get; set; }
    public string LastUpdateId { get; set; }
    public Nullable<System.DateTime> LastUpdateDate { get; set; }
    public int Id { get; set; }
}

查看模型

    public ZipCodeTerritory editPage { get; set; }

    //Constructor
    public ZipCodeEdit()
    {
        SetDropDowns();
    }

    //Drop down list objects
    private string[] states = new string[] { "AL", "AK", "AR", "AZ", "CA", "CO", "CT", "DC", "DE", "FL", "GA", "HI", "IA", "ID", "IL", "IN", "KS", "KY", "LA", "MA", "MD", "ME", "MI", "MN", "MO", "MS", "MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", "NY", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "US", "UT", "VA", "VT", "WA", "WI", "WV", "WY" };
    public IEnumerable<SelectListItem> StateCodes { get; set; }
    public IEnumerable<SelectListItem> ChannelCodes { get; set; }

    //Set state code drop down list
    private void SetDropDowns()
    {
        AgentResources db = new AgentResources();

        //Set stat code drop down items
        StateCodes = StateCodes = states.Select(s => new SelectListItem { Value = s, Text = s });

        //Set channel code drop down list
        ChannelCodes = (from z in db.ZipCodeTerritory
                        select z.ChannelCode).Select(x => new SelectListItem
                        {
                            Text = x,
                            Value = x
                        }).Distinct().ToList();

        db.Dispose();
    }

控制器

    public ActionResult Edit(int id, string searchZip, bool searchActiveOnly, 
        string searchDate, string searchState, string searchTerritory, string searchChannel)
    {
        if (!Security.IsZipCodeViewOnly(User)) return RedirectToAction("Message", "Home", new { id = 1 });

        ZipCodeEdit pageItem = new ZipCodeEdit();

        pageItem.searchZip = searchZip;
        pageItem.searchActiveOnly = searchActiveOnly;
        pageItem.searchDate = searchDate;
        pageItem.searchState = searchState;
        pageItem.searchTerritory = searchTerritory;
        pageItem.searchChannelCode = searchChannel;
        pageItem.editPage = db.ZipCodeTerritory.Find(id);

        return View(pageItem);
    }

查看

这是一个编辑页面,因此视图需要加载ZipCodeTerritory 对象的属性。使用此设置,ChannelCodeDropDownListFor 不仅被正确填充,而且选择了正确的值。 StateCode,但是会按应有的方式填充,但始终选择第一项 AL。无法将 ZipCodeTerritory 对象的 StateCode 值作为默认选定项。

@model Monet.ViewModel.ZipCodeEdit


    <div class="editor-label">
        @Html.LabelFor(model => model.editPage.ChannelCode)
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.editPage.StateCode, new SelectList(Model.StateCodes, "Value", "Text", Model.editPage.StateCode))
        @Html.ValidationMessageFor(model => model.editPage.ChannelCode)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.editPage.StateCode)
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.editPage.StateCode, Model.StateCodes)
        @Html.ValidationMessageFor(model => model.editPage.StateCode)
    </div>

【问题讨论】:

  • 我看不到 SetDropDowns() 的执行,因此我想知道,谁首先设置了 StateCodes?您能否以 IEnumerable 的类型访问 StateCodes 并简单地在 getter 中构建 SelectListItem 列表?

标签: .net asp.net-mvc asp.net-mvc-3 html.dropdownlistfor


【解决方案1】:

在您的视图中,将您的 DropDownList 更改为:

@Html.DropDownListFor(m => m.editPage.StateCode, Model.StateCodes)

此外,states 私有属性不必是 SelectList 类型。它应该是一个字符串数组,如下所示:

private string[] states = new string[] { "AL", "AK", "AR", "AZ", "CA", "CO", "CT", "DC", "DE", "FL", "GA", "HI", "IA", "ID", "IL", "IN", "KS", "KY", "LA", "MA", "MD", "ME", "MI", "MN", "MO", "MS", "MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", "NY", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "US", "UT", "VA", "VT", "WA", "WI", "WV", "WY" };        

然后,您将像这样定义 StateCodes 属性:

StateCodes = states.Select(s => new SelectListItem { Value = s, Text = s });

顺便说一下,View Models 应该是简单的 POCO 类。不要在视图模型中初始化视图模型属性。在您的控制器中执行此操作。

【讨论】:

  • 感谢您的帮助。不过,我想我需要调整DropDownListFor。当页面加载时,它只是为所有 50 个项目显示System.Web.Mvc.SelectListItem
  • 你能用你对 DropDownList 所做的更改来更新你的代码吗?
  • 呃.. 现在我又回到了在下拉列表中显示所有状态,但没有选择正确的状态。
  • 我在这里尝试了代码,它可以工作。请使用您所做的更改更新您的代码,以便我可以告诉您您做错了什么。
  • 我假设 db.ZipCodeTerritory.Find(id) 返回一个具有 StateCode 的 ZipCodeTerritory 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多