【问题标题】:on select change event - Html.DropDownListFor在选择更改事件 - Html.DropDownListFor
【发布时间】:2011-04-25 21:12:30
【问题描述】:

我有两个下拉列表。从第一个中选择的值加载另一个。当我在控制器中有辅助方法时,我该怎么做?

@using (Html.BeginForm())
{
<div>
    <table width="100%" cellpadding="0" cellspacing="0">
        <tr>
            <td><b>Select a District:</b></td>
            <td>@Html.DropDownListFor(m => m.DistrictId, ViewData["DMManagers"] as IEnumerable<SelectListItem>, "Select One")</td>
        </tr>
        <tr>
            <td><b>Select a TM:</b></td>
            <td>@Html.DropDownListFor(m => m.TMId, ViewData["TMManagers"] as IEnumerable<SelectListItem>, "Select One")</td>
        </tr>
    </table>
</div>
}

private void LoadDistrictManagers()
{
    var _DMS = (from c in SessionHandler.CurrentContext.ChannelGroups
                join cgt in SessionHandler.CurrentContext.ChannelGroupTypes on c.ChannelGroupTypeId equals cgt.ChannelGroupTypeId
                where cgt.Name == "District Manager"
                select new { c.ChannelGroupId, c.Name }).OrderBy(m => m.Name);
    ViewData["DMManagers"] = new SelectList(_DMS, "ChannelGroupId", "Name");
}

private void LoadTerritoryManagers(int districtId)
{
    var _TMS = (from c in SessionHandler.CurrentContext.ChannelGroups
                join cgt in SessionHandler.CurrentContext.ChannelGroupTypes on c.ChannelGroupTypeId equals cgt.ChannelGroupTypeId
                where cgt.Name == "Territory" && c.ParentChannelGroupId == districtId
                select new { c.ChannelGroupId, c.Name }).OrderBy(m => m.Name);
    ViewData["TMManagers"] = new SelectList(_TMS, "ChannelGroupId", "Name");
}

public ActionResult SummaryReport()
{
    DistrictManagerModel model = new DistrictManagerModel();
    LoadDistrictManagers();
    return View("AreaManager", model);
}

【问题讨论】:

    标签: c# asp.net-mvc-3 razor


    【解决方案1】:

    使用 HTTPAttributes 字段为两个下拉菜单提供唯一 ID:

    @Html.DropDownListFor(m => m.DistrictId, ViewData["DMManagers"] as IEnumerable<SelectListItem>, "Select One", new {@id="ddlDMManagers"})
    

    第二个下拉菜单应该初始化为一个空列表:

    @Html.DropDownListFor(m => m.TMId, Enumerable.Empty<SelectListItem>(), new {@id="ddlTMManagers"})
    

    如果您不介意在第一个下拉菜单上触发“更改”事件时使用 jQuery ajax 更新第二个下拉菜单:

    $(function() {
        $('select#ddlDMManagers').change(function() {
            var districtId = $(this).val();
    
    
            $.ajax({
                url: 'LoadTerritoryManagers',
                type: 'POST',
                data: JSON.stringify({ districtId: districtId }),
                dataType: 'json',
                contentType: 'application/json',
                success: function (data) {
                    $.each(data, function (key, TMManagers) {
                        $('select#ddlTMManagers').append('<option value="0">Select One</option>');
                        // loop through the TM Managers and fill the dropdown
                        $.each(TMManagers, function(index, manager) {
                            $('select#ddlTMManagers').append(
                                '<option value="' + manager.Id + '">'
                                + manager.Name + 
                                '</option>');
                        });
                    });
                }
            });
        });
    });
    

    将此类添加到您的控制器命名空间:

    public class TMManager
    {
        public int Id {get; set;}
        public string Name {get; set;}
    }
    

    您需要更新控制器操作 LoadTerritoryManagers(),以响应 ajax 请求并返回 {Id,Name} 对象的 JSON 数组。

        [HttpPost]
        public ActionResult LoadTerritoryManagers(int districtId)
        {
            var _TMS = (from c in SessionHandler.CurrentContext.ChannelGroups
                    join cgt in SessionHandler.CurrentContext.ChannelGroupTypes on c.ChannelGroupTypeId equals cgt.ChannelGroupTypeId
                    where cgt.Name == "Territory" && c.ParentChannelGroupId == districtId
                    select new TMManager(){ Id = c.ChannelGroupId, Name = c.Name }).OrderBy(m => m.Name);
    
            if (_TMS == null)
                return Json(null);
    
            List<TMManager> managers = (List<TMManager>)_TMS.ToList();
            return Json(managers);
        }
    

    【讨论】:

    • 感谢您的帮助..它不会填充 TM。可能是jquery中的这一行吗? $.post('/LoadTerritoryManagers', { districtId: districtId }, function (TMManagers)...该应用程序构建良好,但是当我更改 District 时,没有填充 TMs。
    • 我想是的,我可以在一小时内进一步帮助您。如果您愿意,请尝试在您的 LoadTerritoryManagers() 函数中放置一个断点,并查看该函数是否已到达。如果不是,那么问题出在 $.post() 中,就像您怀疑的那样。如果达到,我会使用 Chrome 开发者工具或 Firebug 在 $.post() 行中添加一个断点并单步执行代码以查看发生了什么..
    • 我刚刚调整了这一行: $.post('LoadTerritoryManagers', {districtId: districtId }, function (TMManagers) {...现在每当我更改区域值时,它都会不断添加 Select One第二个下拉列表...
    • 很好,很近。我更新了 $.each() 语句的行。试试看。如果这不起作用,请尝试使用 TMManagers.d 而不是 TMManagers,如下所示: $.each(TMManagers.d, function(.....
    • 当我尝试您编辑的那个时,下拉列表中充满了未定义...与上面的那个一样,我更改了 $.each(TMManagers.d, function(... 这不起作用. 我认为您非常接近完成这项工作..再次感谢您的帮助。
    【解决方案2】:

    使用以下代码。它在我的项目中使用。对于 Zone 和 Region,我使用了两个下拉列表。在更改区域数据时,我加载了区域下拉菜单。

    在查看页面中

     @Html.DropDownList("ddlZone", new SelectList(@ViewBag.Zone, "Zone_Code", "Zone_Name"), "--Select--", new { @class = "LoginDropDown" })
    
     @Html.DropDownList("ddlRegion", Enumerable.Empty<SelectListItem>(), new { @class = "LoginDropDown" })
    

    加载视图页面时需要加载区域。

    在控制器中为Region Load写这个方法

     [WebMethod]
            public JsonResult LoadRegion(string zoneCode)
            {
                ArrayList arl = new ArrayList();
    
                RASolarERPData objDal = new RASolarERPData();
                List<tbl_Region> region = new List<tbl_Region>();
    
                region = erpDal.RegionByZoneCode(zoneCode);
    
                foreach (tbl_Region rg in region)
                {
                    arl.Add(new { Value = rg.Reg_Code.ToString(), Display = rg.Reg_Name });
                }
    
                return new JsonResult { Data = arl };
            }
    

    然后使用下面的 JavaScript

    <script type="text/javascript">
    
            $(document).ready(function () {
    
            $('#ddlZone').change(function () {
                LoadRegion(this.value);
            });
    
            function LoadRegion(zoneCode) {
    
                $.ajax({
                    type: "POST",
                    url: '@Url.Action("LoadRegion", "RSFSecurity")',
                    data: "{'zoneCode':'" + zoneCode + "'}",
                    contentType: "application/json; charset=utf-8",
                    dataType: 'json',
                    cache: false,
                    success: function (data) {
                        $('#ddlRegion').get(0).options.length = 0;
                        $('#ddlRegion').get(0).options[0] = new Option("--Select--", "0");
    
                        $.map(data, function (item) {
                            $('#ddlRegion').get(0).options[$('#ddlRegion').get(0).options.length] = new Option(item.Display, item.Value);
                        });
                    },
                    error: function () {
                        alert("Failed to load Item");
                    }
                });
            }
    
        });
    
    </script>
    

    【讨论】:

      【解决方案3】:

      我们可以像这样使用 jquery 来获取和填充下拉列表:

      <script>
        function FillCity() {
          var stateId = $('#State').val();
          $.ajax({
              url: '/Employees/FillCity',
              type: "GET",
              dataType: "JSON",
              data: { State: stateId},
              success: function (cities) {                    
                  $("#City").html(""); // clear before appending new list 
                  $.each(cities, function (i, city) {
                      $("#City").append(
                          $('<option></option>').val(city.CityId).html(city.CityName));
                  });
              }
          });
        }
      </script>
      

      更多详情见 MVC DropDownListFor fill on selection change of another dropdown

      【讨论】:

        猜你喜欢
        • 2012-08-20
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多